为什么有时 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)
........
在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)。