为什么有时 Directory.CreateDirectory 会失败

本文关键字:失败 CreateDirectory Directory 为什么 | 更新日期: 2023-09-27 18:32:23

这是我用来提取zip文件的代码,以确保目标目录中没有任何脏文件

internal void UnzipProject()
{
    if (Directory.Exists(SourceDir))
        Directory.Delete(SourceDir, true);
    if (File.Exists(CodeZipFile))
    {
        Directory.CreateDirectory(SourceDir); // fails here
        ZipFile.ExtractToDirectory(CodeZipFile, SourceDir);
    }
}

有时Directory.CreateDirectory(SourceDir)无法创建新的目录,我在下一行出现异常,但如果我退后一步并重试创建目录,它会起作用。在下次执行时重复完全相同的模式。

编辑
这是实际上关于尚未创建的 dir 的例外,我可以看到 src dir 不存在:

System.UnauthorizedAccessException was unhandled
  HResult=-2147024891
  Message=Access to the path '(...MyPath...)'src'MySolution.sln' is denied.
  Source=mscorlib
  StackTrace:
       at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
       at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
       at System.IO.Compression.ZipFileExtensions.ExtractToFile(ZipArchiveEntry source, String destinationFileName, Boolean overwrite)
       at System.IO.Compression.ZipFileExtensions.ExtractToDirectory(ZipArchive source, String destinationDirectoryName)
       at System.IO.Compression.ZipFile.ExtractToDirectory(String sourceArchiveFileName, String destinationDirectoryName, Encoding entryNameEncoding)
       at System.IO.Compression.ZipFile.ExtractToDirectory(String sourceArchiveFileName, String destinationDirectoryName)
........

为什么有时 Directory.CreateDirectory 会失败

在Windows 7,.Net 4.0,VS2010下遇到此问题。看起来 Directory.Delete() 不是同步的,所以问题是时间问题。我猜 Directory.CreateDirectory() 不会失败,因为现有文件夹被标记为删除。然后,随着 Directory.Delete() 的完成,新文件夹将被删除。

我发现这始终有效:

if (Directory.Exists(myPath))
  {
  Directory.Delete(myPath, true);
  while (Directory.Exists(myPath))
    System.Threading.Thread.Sleep(10);
  }
Directory.CreateDirectory(myPath);

错误实际上已经在异常中了。

System.UnauthorizedAccessException was unhandled

您需要添加代码来检查/验证用户是否有权访问该文件夹。

谢谢大家帮助我解决这个问题。问题是在调用其删除后立即创建一个目录。在我的情况下,删除的dir是空的,但可能是由于文件系统延迟,在完全删除之前它变得无法访问。我正在为面临相同问题的其他人分享解决方案:

internal void UnzipProject()
{
    if (Directory.Exists(SourceDir))
    {
        DirectoryInfo di = new DirectoryInfo(SourceDir);
        foreach (FileInfo file in di.GetFiles())
            file.Delete();
        foreach (DirectoryInfo dir in di.GetDirectories())
            dir.Delete(true);
    }
    if (File.Exists(zipFile))
        ZipFile.ExtractToDirectory(zipFile, SourceDir);
    else
    {
        if (Directory.Exists(SourceDir))
            Directory.Delete(SourceDir, true);
    }
}

我自己也经历过这种行为。如果我没记错的话,发生这种情况是因为 Directory.Delete 仍在尝试删除目录,同时 Directory.CreateDirectory 正在尝试重新创建它。创建目录将失败,因为系统仍锁定该资源以进行删除。

我通过在调用 Delete 和调用 CreateDirectory 之间引入轻微的延迟来避免此问题。我记得使用过的另一个选项是重命名目录,然后将其删除。例如,如果原始目录名为 MyApp,我会将其重命名为 DeleteMe,然后删除该目录。CreateDirectory应该能够创建MyApp目录,因为它不再存在。

我的同事在频繁重写文件时遇到了此错误。他告诉Fyle系统很慢。如果您有同样的问题,您尝试创建一个尚未删除的文件夹。

尝试在 UnauthorizedAccessException 上重复一次您的方法,或者在 Directory.Delete 之后添加 Thread.Sleep(100)。