1

我想对我的 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不再隐藏的隐藏文件,循环尝试复制它,并在此过程中生成此异常:

拒绝访问路径“AUTORUN.INF”。

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

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


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

File.CopyDrive(driveLetter, destinationFolder)

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

提前致谢。

4

3 回答 3

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 这样的检查,如果目标路径中存在某种目录结构,您可以添加这些检查。如果您正在尝试创建某种简单的同步应用程序,那么它会变得有点困难,因为您需要删除或对不再存在的文件/文件夹采取其他操作。

于 2012-09-13T01:19:15.763 回答
0

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

于 2012-09-13T00:56:00.653 回答
0

您可能想查看重载的CopyDirectory

CopyDirectory(String, String, UIOption, UICancelOption)

它将遍历所有子目录。

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

给我发电子邮件。

于 2012-09-13T12:11:02.100 回答