我想准确复制我的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);
}
此时一切正常但不是我想要的,因为这不会复制文件夹结构。还有一些错误发生如下......
AUTORUN.INF
隐藏文件,不再隐藏,循环尝试复制它,并在此过程中生成此异常:< / LI>
拒绝访问路径'AUTORUN.INF'。
指定的路径,文件名或两者都太长。完全 限定文件名必须少于260个字符,并且 目录名称必须少于248个字符。
所以,我不知道如何实现这一点并验证每个可能的错误案例。我想知道是否有另一种方法可以做到这一点以及如何(或许某些库)或更简单的东西,如具有以下结构的实现方法:
File.CopyDrive(driveLetter, destinationFolder)
(也将接受VB.NET答案)。
提前致谢。
答案 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)
它将通过所有子目录进行递归。
如果你想要一个独立的应用程序,我编写了一个应用程序,它从一个选定的目录复制到另一个目录,覆盖更新的文件并根据需要添加子目录。
只需给我发电子邮件。