使用System.IO在C#中复制文件夹

时间:2009-03-24 12:47:29

标签: c# asp.net file-io .net

我需要将文件夹C:\ FromFolder复制到C:\ ToFolder

以下代码将切断我的FromFolder,然后创建我的ToFolder。 所以我的FromFolder将会消失,所有项目都将在新创建的名为ToFolder

的文件夹中
System.IO.Directory.Move(@"C:\FromFolder ", @"C:\ToFolder");

但我只是想将FromFolder中的文件复制到ToFolder。 由于某种原因,没有System.IO.Directory.Copy ???

如何使用批处理文件完成此操作 - 非常简单

xcopy C:\ FromFolder C:\ ToFolder

此致 艾蒂安

10 个答案:

答案 0 :(得分:18)

有一个文件副本。 创建文件夹并将原始目录中的所有文件复制到新目录 example

static void Main(string[] args)
    {
        DirectoryInfo sourceDir = new DirectoryInfo("c:\\a");
        DirectoryInfo destinationDir = new DirectoryInfo("c:\\b");

        CopyDirectory(sourceDir, destinationDir);

    }

    static void CopyDirectory(DirectoryInfo source, DirectoryInfo destination)
    {
        if (!destination.Exists)
        {
            destination.Create();
        }

        // Copy all files.
        FileInfo[] files = source.GetFiles();
        foreach (FileInfo file in files)
        {
            file.CopyTo(Path.Combine(destination.FullName, 
                file.Name));
        }

        // Process subdirectories.
        DirectoryInfo[] dirs = source.GetDirectories();
        foreach (DirectoryInfo dir in dirs)
        {
            // Get destination directory.
            string destinationDir = Path.Combine(destination.FullName, dir.Name);

            // Call CopyDirectory() recursively.
            CopyDirectory(dir, new DirectoryInfo(destinationDir));
        }
    }

答案 1 :(得分:17)

这个链接提供了一个很好的例子。

http://msdn.microsoft.com/en-us/library/cc148994.aspx

这是一个片段

// To copy all the files in one directory to another directory.
// Get the files in the source folder. (To recursively iterate through
// all subfolders under the current directory, see
// "How to: Iterate Through a Directory Tree.")
// Note: Check for target path was performed previously
//       in this code example.
if (System.IO.Directory.Exists(sourcePath))
{
  string[] files = System.IO.Directory.GetFiles(sourcePath);

  // Copy the files and overwrite destination files if they already exist.
  foreach (string s in files)
  {
    // Use static Path methods to extract only the file name from the path.
    fileName = System.IO.Path.GetFileName(s);
    destFile = System.IO.Path.Combine(targetPath, fileName);
    System.IO.File.Copy(s, destFile, true);
  }
}

答案 2 :(得分:5)

复制目录(正确)实际上是一项相当复杂的任务,尤其是考虑到交叉点和硬链接等高级文件系统技术。您最好的选择是使用支持它的API。如果你不怕一点P / Invoke,shell32中的SHFileOperation是你最好的选择。另一种方法是在Microsoft.VisualBasic程序集中使用Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory方法(即使您没有使用VB)。

答案 3 :(得分:4)

是的,你是对的。

http://msdn.microsoft.com/en-us/library/system.io.directoryinfo.aspx

提供了复制功能.. 或者您可以使用其他功能

http://msdn.microsoft.com/en-us/library/ms127960.aspx

答案 4 :(得分:2)

您需要从头创建一个新目录,然后遍历源目录中的所有文件并将其复制过来。

string[] files = Directory.GetFiles(GlobalVariables.mstrReadsWellinPath);
foreach(string s in files)
{
        fileName=Path.GetFileName(s);
        destFile = Path.Combine(DestinationPath, fileName);
        File.Copy(s, destFile);
}

我离开创建目标目录: - )

答案 5 :(得分:2)

你是对的。没有Directory.Copy方法。对于毫无戒心的开发人员来说,这将是一个非常强大的方法,但也是一个危险的方法。复制文件夹可能是一个非常耗时的操作,而移动一个(在同一个驱动器上)则不是。

我想微软认为它可以逐个文件复制,因此您可以显示某种进度信息。您可以通过创建DirectoryInfo实例然后调用GetFiles()来遍历目录中的文件。要包含子目录,您还可以调用GetDirectories()并使用递归方法枚举这些子目录。

答案 6 :(得分:2)

一个简单的函数,它将源文件夹的全部内容复制到目标文件夹,并创建目标文件夹(如果它不存在)

class Utils
{
    internal static void copy_dir(string source, string dest)
    {
        if (String.IsNullOrEmpty(source) || String.IsNullOrEmpty(dest)) return;
        Directory.CreateDirectory(dest);
        foreach (string fn in Directory.GetFiles(source))
        {
            File.Copy(fn, Path.Combine(dest, Path.GetFileName(fn)), true);
        }
        foreach (string dir_fn in Directory.GetDirectories(source))
        {
            copy_dir(dir_fn, Path.Combine(dest, Path.GetFileName(dir_fn)));
        }
    }
}

答案 7 :(得分:1)

This article provides an alogirthm to copy recursively some folder and all its content

来自文章:

  

遗憾的是,System.IO中没有内置函数可以复制文件夹及其内容。以下是一个简单的递归算法,可以复制文件夹,子文件夹和文件,并在需要时创建目标文件夹。为简单起见,没有错误处理;如果出现任何问题,将抛出异常,例如null或无效路径,或者目标文件是否已存在。

祝你好运!

答案 8 :(得分:0)

我的DirectoryInfo.CopyTo版本使用扩展名。

public static class DirectoryInfoEx {
    public static void CopyTo(this DirectoryInfo source, DirectoryInfo target) {
        if (source.FullName.ToLower() == target.FullName.ToLower())
            return;

        if (!target.Exists)
            target.Create();

        foreach (FileInfo f in source.GetFiles()) {
            FileInfo newFile = new FileInfo(Path.Combine(target.FullName, f.Name));
            f.CopyTo(newFile.FullName, true);
        }

        foreach (DirectoryInfo diSourceSubDir in source.GetDirectories()) {
            DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name);
            diSourceSubDir.CopyTo(nextTargetSubDir);
        }
    }
}

并使用那样......

DirectoryInfo d = new DirectoryInfo("C:\Docs");
d.CopyTo(new DirectoryInfo("C:\New"));

答案 9 :(得分:0)

此代码使用户能够将一个目录的内容复制到另一个目录。

using System;
using System.IO;

// ...
    static void Main(string[] args)
    {
        Console.ForegroundColor = ConsoleColor.Cyan;

        Console.Write("Copying... ");
        DirectoryCopy(@"D:\Projects\Lloyds", @"C:\Lloyds");

        Console.WriteLine("Completed");

        Console.ForegroundColor = ConsoleColor.Gray;
        Console.Write("Press any key to quit . . . ");
        Console.ReadKey(true);
    }

    static void DirectoryCopy(string source, string destination)
    {
        Directory.CreateDirectory(destination);
        DirectoryInfo sourceDirectory = new DirectoryInfo(source);

        foreach (FileInfo file in sourceDirectory.GetFiles())
            File.Copy(file.FullName, Path.Combine(destination, file.Name));

        foreach (DirectoryInfo directory in sourceDirectory.GetDirectories())
            DirectoryCopy(directory.FullName, Path.Combine(destination, directory.Name));
    }