public override bool Execute ()
{
if (sourceFiles.Length == 0)
// nothing to copy!
return true;
try {
List <ITaskItem> temporaryCopiedFiles = new List <ITaskItem> ();
if (sourceFiles != null && destinationFiles != null &&
sourceFiles.Length != destinationFiles.Length) {
Log.LogError ("Number of source files is different than number of destination files.");
return false;
}
if (destinationFiles != null && destinationFolder != null) {
Log.LogError ("You must specify only one attribute from DestinationFiles and DestinationFolder");
return false;
}
if (destinationFiles != null && destinationFiles.Length > 0) {
for (int i = 0; i < sourceFiles.Length; i ++) {
ITaskItem sourceItem = sourceFiles [i];
ITaskItem destinationItem = destinationFiles [i];
string sourceFile = sourceItem.GetMetadata ("FullPath");
string destinationFile = destinationItem.GetMetadata ("FullPath");
if (!File.Exists (sourceFile)) {
Log.LogError ("Cannot copy {0} to {1}, as the source file doesn't exist.", sourceFile, destinationFile);
continue;
}
if (!skipUnchangedFiles || HasFileChanged (sourceFile, destinationFile))
CopyFile (sourceFile, destinationFile, true);
sourceItem.CopyMetadataTo (destinationItem);
temporaryCopiedFiles.Add (destinationItem);
}
} else if (destinationFolder != null) {
List<ITaskItem> temporaryDestinationFiles = new List<ITaskItem> ();
string destinationDirectory = destinationFolder.GetMetadata ("FullPath");
bool directoryCreated = CreateDirectoryIfRequired (destinationDirectory);
foreach (ITaskItem sourceItem in sourceFiles) {
string sourceFile = sourceItem.GetMetadata ("FullPath");
string filename = sourceItem.GetMetadata ("Filename") + sourceItem.GetMetadata ("Extension");
string destinationFile = Path.Combine (destinationDirectory,filename);
if (!File.Exists (sourceFile)) {
Log.LogError ("Cannot copy {0} to {1}, as the source file doesn't exist.", sourceFile, destinationFile);
continue;
}
if (!skipUnchangedFiles || directoryCreated ||
HasFileChanged (sourceFile, destinationFile))
CopyFile (sourceFile, destinationFile, false);
temporaryCopiedFiles.Add (new TaskItem (
Path.Combine (destinationFolder.GetMetadata ("Identity"), filename),
sourceItem.CloneCustomMetadata ()));
temporaryDestinationFiles.Add (new TaskItem (
Path.Combine (destinationFolder.GetMetadata ("Identity"), filename),
sourceItem.CloneCustomMetadata ()));
}
destinationFiles = temporaryDestinationFiles.ToArray ();
} else {
Log.LogError ("You must specify DestinationFolder or DestinationFiles attribute.");
return false;
}
copiedFiles = temporaryCopiedFiles.ToArray ();
return true;
}
catch (Exception ex) {
Log.LogErrorFromException (ex);
return false;
}
}