gpt4 book ai didi

C# 目录复制不返回错误,但不复制目录

转载 作者:太空宇宙 更新时间:2023-11-03 15:01:40 24 4
gpt4 key购买 nike

我正在编写一个非常小的应用程序,通过添加一些自动化功能将目录从一个地方复制到另一个地方。除了实际的复制方法外,整个应用程序都可以完美运行。最糟糕的是我没有收到任何错误,正如你们大多数人所知,这比收到错误更糟糕。

这里是有问题的方法:

public static bool CopyDir(string sPath, string dPath)
{
string[] files = Directory.GetFiles(sPath);
try
{
foreach (string file in files)
{
string name = Path.GetFileName(file);

foreach (string dirPath in Directory.GetDirectories(sPath, "*",
SearchOption.AllDirectories))
Directory.CreateDirectory(dirPath.Replace(sPath, dPath));

foreach (string newPath in Directory.GetFiles(sPath, "*.*",
SearchOption.AllDirectories))
File.Copy(newPath, newPath.Replace(sPath, dPath), true);
}
} catch // this is no use because the Exception is empty.
{
return false;
}
return false; //the app keeps executing to here and I don't know why
}

调试器的变量转储:

  • sPath: "C:\\Users\\Jacob Jewett\\Downloads\\func1"
  • dPath: "C:\\Users\\Jacob Jewett\\AppData\\Roaming\\.minecraft\\saves\\data\\functions\\"
  • 文件:[0] “C:\\Users\\Jacob Jewett\\Downloads\\func1\\main.mcfunction”

Downloads\func1 的文件夹树(sPath):

func1
main.mcfunction

编辑(下午 2:33):好的,这是我重构的代码,它返回 File in use 错误但不复制任何内容。

   public static bool CopyDir(string sPath, string dPath)
{
try
{
foreach (string dirPath in Directory.GetDirectories(sPath, "*",
SearchOption.AllDirectories))
Directory.CreateDirectory(dirPath.Replace(sPath, dPath));

foreach (string newPath in Directory.GetFiles(dPath, "*.*",
SearchOption.AllDirectories))
File.Copy(newPath, newPath.Replace(sPath, dPath), true);
return true;
}
catch (UnauthorizedAccessException e)
{
MessageBox.Show("Attempt to copy failed. Raw: "+e,"IO Error",MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}

编辑(17 月 8 日 29 日下午 12:09):我对方法做了一些调整,现在我得到了 路径访问 [ path] 被拒绝。,总比没有好,但我还没有找到可行的解决方案。我在这里浏览了一些错误,大多数人说在调用 File.Copy() 方法之前放置 File.SetAttributes()。这没有效果。或者,我尝试在完成任何复制之前将 sPath1 的属性 Read-Only 目录设置为 none,这也没有效果。

当前代码:

public static bool CopyDir(string sPath, string dPath)
{
try
{
DirectoryInfo spdi = new DirectoryInfo(sPath);
spdi.Attributes &= ~FileAttributes.ReadOnly;
foreach (string dirPath in Directory.GetDirectories(sPath, "*",
SearchOption.AllDirectories))
Directory.CreateDirectory(dirPath);

foreach (string newPath in Directory.GetFiles(dPath, "*.*",
SearchOption.AllDirectories))
{
File.SetAttributes(dPath, FileAttributes.Normal);
File.Copy(sPath, newPath);
}
Directory.CreateDirectory(dPath);
return true;
}
catch (UnauthorizedAccessException e)
{
MessageBox.Show("Attempt to copy failed. (UAC) Raw: "+e,"IO Error",MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}

最佳答案

编辑:我重新阅读了您的代码,我认为我遇到了真正的问题。

以下说明足以将所有子目录和文件复制到目标位置。

foreach (string dirPath in Directory.GetDirectories(sPath, "*",
SearchOption.AllDirectories))
Directory.CreateDirectory(dirPath.Replace(sPath, dPath));

foreach (string newPath in Directory.GetFiles(sPath, "*.*",
SearchOption.AllDirectories))
File.Copy(newPath, newPath.Replace(sPath, dPath), true);

外层的 foreach 是多余的。

修改后的代码:

public static bool CopyDir(string sPath, string dPath)
{
try
{
foreach (string dirPath in Directory.GetDirectories(sPath, "*",
SearchOption.AllDirectories))
Directory.CreateDirectory(dirPath.Replace(sPath, dPath));

foreach (string newPath in Directory.GetFiles(sPath, "*.*",
SearchOption.AllDirectories))
File.Copy(newPath, newPath.Replace(sPath, dPath), true);
}
catch // this is no use because the Exception is empty.
{
return false;
}

return false; //the app keeps executing to here and I don't know why
}

也就是说,在 catch block 中对 Exception 做一些事情是一个很好的做法。即使它只是记录它 :) 这样你就可以排除它是否没有记录。

关于C# 目录复制不返回错误,但不复制目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45924149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com