如何将文件从一个磁盘复制到具有相同文件夹结构的另一个位置?

时间:2012-09-13 00:35:50

标签: c# vb.net file copy .net

我想准确复制我的USB驱动器I:/上的某些文件,目录和子目录,并希望它们位于C:/backup (例如)

我的USB驱动器具有以下结构:

(只是要知道,这是一个例子,我的驱动器有更多的文件,目录和子目录)

  
      
  • 课程/ data_structures / db.sql

  •   
  • 游戏/ PC / PC-的Game.exe

  •   
  • 考试/ exam01.doc

  •   

好吧,我不知道如何从这开始,但我的第一个想法是让所有files做到这一点:

string[] files = Directory.GetFiles("I:");

下一步可能是制作循环并使用File.Copy指定目标路径:

string destinationPath = @"C:/backup";

foreach (string file in files)
{
  File.Copy(file, destinationPath + "\\" + Path.GetFileName(file), true);
}

此时一切正常但不是我想要的,因为这不会复制文件夹结构。还有一些错误发生如下......

  • 第一个发生是因为我的PC配置显示每个文件夹的隐藏文件,而我的USB有一个AUTORUN.INF隐藏文件,不再隐藏,循环尝试复制它,并在此过程中生成此异常:< / LI>
  

拒绝访问路径'AUTORUN.INF'。

  • 当某些路径太长时会发生第二个路径,这会产生以下异常:
  

指定的路径,文件名或两者都太长。完全   限定文件名必须少于260个字符,并且   目录名称必须少于248个字符。


所以,我不知道如何实现这一点并验证每个可能的错误案例。我想知道是否有另一种方法可以做到这一点以及如何(或许某些库)或更简单的东西,如具有以下结构的实现方法:

File.CopyDrive(driveLetter, destinationFolder)

(也将接受VB.NET答案)。

提前致谢。

3 个答案:

答案 0 :(得分:3)

public static void Copy(string src, string dest)
{
    // copy all files
    foreach (string file in Directory.GetFiles(src))
    {
        try
        {
            File.Copy(file, Path.Combine(dest, Path.GetFileName(file)));
        }
        catch (PathTooLongException)
        {
        }
        // catch any other exception that you want.
        // List of possible exceptions here: http://msdn.microsoft.com/en-us/library/c6cfw35a.aspx
    }

    // go recursive on directories
    foreach (string dir in Directory.GetDirectories(src))
    {

        // First create directory...
        // Instead of new DirectoryInfo(dir).Name, you can use any other way to get the dir name,
        // but not Path.GetDirectoryName, since it returns full dir name.
        string destSubDir = Path.Combine(dest, new DirectoryInfo(dir).Name);
        Directory.CreateDirectory(destSubDir);
        // and then go recursive
        Copy(dir, destSubDir);
    }
}

然后你可以称之为:

Copy(@"I:\", @"C:\Backup");

没有时间测试它,但我希望你能得到这个想法......

编辑:在上面的代码中,没有像Directory.Exists这样的检查,如果某种目录结构存在于目标路径,则可以添加这些检查。如果您正在尝试创建某种简单的同步应用程序,那么它会变得更难,因为您需要删除或对不再存在的文件/文件夹采取其他操作。

答案 1 :(得分:0)

这通常以递归下降解析器开始。这是一个很好的例子:http://msdn.microsoft.com/en-us/library/bb762914.aspx

答案 2 :(得分:0)

您可能希望查看重载的CopyDirectory

CopyDirectory(String, String, UIOption, UICancelOption)

它将通过所有子目录进行递归。

如果你想要一个独立的应用程序,我编写了一个应用程序,它从一个选定的目录复制到另一个目录,覆盖更新的文件并根据需要添加子目录。

只需给我发电子邮件。