简体   繁体   中英

Copy all files in directory

How can I copy all of the contents in one directory to another with out looping over each file?

You can't. Neither Directory nor DirectoryInfo provide a Copy method. You need to implement this yourself.

void Copy(string sourceDir, string targetDir)
{
    Directory.CreateDirectory(targetDir);

    foreach(var file in Directory.GetFiles(sourceDir))
        File.Copy(file, Path.Combine(targetDir, Path.GetFileName(file)));

    foreach(var directory in Directory.GetDirectories(sourceDir))
        Copy(directory, Path.Combine(targetDir, Path.GetFileName(directory)));
}

Please read the comments to be aware of some problems with this simplistic approach.

Msdn 有这方面的指导 -如何:复制目录

You can use VB's FileSystem.CopyDirectory method to simplify the task:

using Microsoft.VisualBasic.FileIO;

foo(){
    FileSystem.CopyDirectory(directoryPath, tempPath);
}
using System.IO;

string sourcePath = @"D:\test";
string targetPath = @"D:\test_new";
if (!Directory.Exists(targetPath))
{
   Directory.CreateDirectory(targetPath);
}
foreach (var srcPath in Directory.GetFiles(sourcePath))
{
    //Copy the file from sourcepath and place into mentioned target path, 
    //Overwrite the file if same file is exist in target path
    File.Copy(srcPath, srcPath.Replace(sourcePath, targetPath), true);
}

KISS – Keep It Simple Stupid… is a good rule of thumb for any situation, including programming.

Here is the simplest method of copying all files, folders, sub-folders and all their files and folders while keeping the original hierarchy. It also displays a nice Microsoft Windows progress dialog box. Simply follow these basic instructions:

1: Open a new C# console application in Visual Studio – version (whatever)

2: From the menu bar; go to “Tools – Nuget Package Manager – Manage Nuget Packages for Solution” In the Nuget package manager search box, type – “Microsoft.VisualBasic” and select the “.Net” package.

3: Back on the “Program.cs” page, add the following “using” statements:

Using System;

Using Microsoft.VisualBasic.FileIO;

4: Inside the “Main” method, type the code provided below, replacing the source and destination paths with your folder/drives.

5: The “Console.WriteLine” line simply displays a message that it is copying and to “Please Stand by”. This line of code is completely optional. Not needed for this process to work.

6: The “FileSystem.CopyDirectory” command is a basic copy function to copy the folder and contents to the new destination. The only real difference is that the “UIOption.AllDialgs” command is added to the end of the copy command. This is the part that generates the Microsoft Windows Progress Dialog box.

Now, add the following code to your C# “Program.cs” page.

using System;
using Microsoft.VisualBasic.FileIO;


namespace ProgressDialogBox
{
    class Program
    {
        static void Main(string[] args)
        {

            string sourcePath = @"c:\TestA\TestNew3";
            string destinationPath = @"c:\TestB\TestNew4";

            Console.WriteLine(@"Copying... {0} ... Please stand by ", sourcePath);
            FileSystem.CopyDirectory(sourcePath, destinationPath, UIOption.AllDialogs);

        }
    }
}

This whole process takes less than 3 minutes to create. It actually takes longer to read this posting than to create and execute the program.

Enjoy.

Hope this helps someone in the future.

Here is the link from Microsoft that I used for reference:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/file-system/how-to-provide-a-progress-dialog-box-for-file-operations

This works great! It will copy sub directories or you can just dump all the files from all subdirectories into one location.

/// AUTHOR : Norm Petroff 
/// <summary>
/// Takes the files from the PathFrom and copies them to the PathTo. 
/// </summary>
/// <param name="pathFrom"></param>
/// <param name="pathTo"></param>
/// <param name="filesOnly">Copies all files from each directory to the "PathTo" and removes directory.</param>
public static void CopyFiles(String pathFrom, String pathTo, Boolean filesOnly)
{
    foreach(String file in Directory.GetFiles(pathFrom))
    {
        // Copy the current file to the new path. 
        File.Copy(file, Path.Combine(pathTo, Path.GetFileName(file)), true);
    }

    // Get all the directories in the current path. 
    foreach (String directory in Directory.GetDirectories(pathFrom))
    { 
         // If files only is true then recursively get all the files. They will be all put in the original "PathTo" location 
         // without the directories they were in. 
         if (filesOnly)
         {
              // Get the files from the current directory in the loop. 
              CopyFiles(directory, pathTo, filesOnly);
         }
         else
         {
              // Create a new path for the current directory in the new location.                      
              var newDirectory = Path.Combine(pathTo, new DirectoryInfo(directory).Name);

              // Copy the directory over to the new path location if it does not already exist. 
              if (!Directory.Exists(newDirectory))
              {
                  Directory.CreateDirectory(newDirectory);
              }
              // Call this routine again with the new path. 
              CopyFiles(directory, newDirectory, filesOnly);
        }
    }
}

You can't. But you can use some sort of succinct code like Directory.GetFiles(mydir).ToList().ForEach(f => File.Copy(f, otherdir + "\\\\" + Path.GetFileName(f));

Execute xcopy source_directory\\*.* destination_directory as an external command. Of course this will only work on Windows machines.

While the C# approach works well, it's not always the best answer. A simple DOS batch script works much better by ignoring the 256 character limit found in the C# approach.

robocopy C:\myFiles D:\masterBackup\myFiles /E /V 

The only draw back I have found with the DOS batch script is that it will not (in some cases) copy SQL Server "mdf" data files and "ldf" log files using the "robocopy" command. But that's a permissions issue.

Otherwise, I have relied more on the DOS batch script for my incremental and full backups.

Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory + @"resources\html")
    .ToList()
    .ForEach(f => File.Copy(f, folder + "\\" + f.Substring(f.LastIndexOf("\\"))));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM