Скопируйте файлы папок xcopy (ish) style (Q & A)

Я хочу сделать несколько вещей

  • копировать файлы, такие как xcopy source target/d
  • копировать файлы, такие как xcopy source target/d/s
  • скопируйте все вышеуказанные файлы с помощью дополнительной маски
  • скопировать все файлы из источника и подпапок в целевую папку

Ответ 1

Если цель не существует, код становится более понятным, используя "||! destFile.Exists". Технически создание файловой системы для несуществующего файла будет иметь значение LastWriteTime of DateTime.Min, поэтому будет копировать, но немного сократит читаемость. Более надежный обработчик ошибок был бы идеальным, но это еще одна тема.:) Я надеюсь, что этот проверенный код поможет кому-то.

копировать файлы, такие как xcopy source target/d

CopyFolderContents(sourceFolder, destinationFolder);

копировать файлы, такие как xcopy source target/d/s

CopyFolderContents(sourceFolder, destinationFolder, "*.*", true, true);

скопируйте все вышеуказанные файлы с помощью дополнительной маски

CopyFolderContents(sourceFolder, destinationFolder, "*.png", true, true);

скопировать все файлы из источника и подпапок в целевую папку

CopyFolderContents(sourceFolder, destinationFolder, "*.*", false, true);

который охватывает вопросы, здесь приведен код с перегрузками для вашего удобства.

public void CopyFolderContents(string sourceFolder, string destinationFolder)
{
    CopyFolderContents(sourceFolder, destinationFolder, "*.*", false, false);
}

public void CopyFolderContents(string sourceFolder, string destinationFolder, string mask)
{
    CopyFolderContents(sourceFolder, destinationFolder, mask, false, false);
}

public void CopyFolderContents(string sourceFolder, string destinationFolder, string mask, Boolean createFolders, Boolean recurseFolders)
{
    try
    {
        if (!sourceFolder.EndsWith(@"\")){ sourceFolder += @"\"; }
        if (!destinationFolder.EndsWith(@"\")){ destinationFolder += @"\"; }

        var exDir = sourceFolder;
        var dir = new DirectoryInfo(exDir);
        SearchOption so = (recurseFolders ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);

        foreach (string sourceFile in Directory.GetFiles(dir.ToString(), mask, so))
        {
            FileInfo srcFile = new FileInfo(sourceFile);
            string srcFileName = srcFile.Name;

            // Create a destination that matches the source structure
            FileInfo destFile = new FileInfo(destinationFolder + srcFile.FullName.Replace(sourceFolder, ""));

            if (!Directory.Exists(destFile.DirectoryName ) && createFolders)
            {
                Directory.CreateDirectory(destFile.DirectoryName);
            }

            if (srcFile.LastWriteTime > destFile.LastWriteTime || !destFile.Exists)
            {
                File.Copy(srcFile.FullName, destFile.FullName, true);
            }
        }
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message + Environment.NewLine + Environment.NewLine + ex.StackTrace);
    }
}