我正在尝试此功能,它将文件夹中的所有文件以及带有文件的相关子文件夹复制到另一个位置:
using System.IO;
private static bool CopyDirectory(string SourcePath, string DestinationPath, bool overwriteexisting)
{
bool ret = true;
try
{
SourcePath = SourcePath.EndsWith(@"\") ? SourcePath : SourcePath + @"\";
DestinationPath = DestinationPath.EndsWith(@"\") ? DestinationPath : DestinationPath + @"\";
if (Directory.Exists(SourcePath))
{
if (Directory.Exists(DestinationPath) == false)
Directory.CreateDirectory(DestinationPath);
foreach (string fls in Directory.GetFiles(SourcePath))
{
FileInfo flinfo = new FileInfo(fls);
flinfo.CopyTo(DestinationPath + flinfo.Name, overwriteexisting);
}
foreach (string drs in Directory.GetDirectories(SourcePath))
{
DirectoryInfo drinfo = new DirectoryInfo(drs);
if (CopyDirectory(drs, DestinationPath + drinfo.Name, overwriteexisting) == false || drs.Substring(drs.Length-8) == "archive")
ret = false;
}
}
else
{
ret = false;
}
}
catch (Exception e)
{
Console.WriteLine("{0} {1} {2}", e.Message, Environment.NewLine + Environment.NewLine, e.StackTrace);
ret = false;
}
return ret;
}
在您必须将文件夹复制到另一个位置之前,它工作得很好,但是当您必须自己创建一个文件夹时(在我的示例中,我正在做一个名为“归档”的子文件夹来跟踪最后一个文件夹文件的更改)它去在无限循环中,因为它不断在 Directory.GetDirectories foreach 循环中重新扫描自身,找到新创建的子文件夹并一遍又一遍地嵌套相同的子文件夹,直到它达到“路径名太长,最大 260 个字符限制异常”。
我试图通过使用条件来避免它
|| drs.Substring(drs.Length-8) == "存档")
这应该检查目录名称,但它似乎不起作用。
我认为不同的解决方案,例如放置最大子文件夹深度扫描(IE 最大 2 个子文件夹),因此它不会继续重新扫描所有嵌套文件夹,但我在 Directory 对象中找不到这样的属性。
我无法将整个内容复制到临时文件夹,然后再复制到真实文件夹,因为下次我扫描它时,它也会重新扫描存档文件夹。
我坚持将所有目录列表放在目录对象的 ArrayList 中,所以也许我可以检查 DirName 之类的东西,但我不知道这样的属性是否存在。
有什么解决办法吗?