当尝试创建目录时,IOException ("文件或目录已经存在")

本文关键字:quot 存在 文件 IOException 创建目录 | 更新日期: 2023-09-27 17:51:03

我在c#项目中遇到了一个奇怪的问题,它发生在试图通过IronPython脚本创建目录时。这是代码:

targetTemplateDirectory = Path.Combine(Data, "Templates''CheckedReports")
if not Directory.Exists(targetTemplateDirectory):
    Directory.CreateDirectory(targetTemplateDirectory)

问题是IOException告诉我不可能创建文件夹"H:'ProductName'Data'Templates'CheckedReports",因为已经存在同名的文件或目录。

根据MSDN,当目录已经存在时,Directory.CreateDirectory()方法不会抛出任何异常。

我知道一个名为"CheckedReports"的文件可能是导致此异常的原因,但是客户手动创建该文件的可能性非常非常小。除此之外,没有一行代码包含单词"CheckedReports"(除了提到的脚本)。此外,这个应用程序被几千个客户使用,脚本在每台机器上执行,只有一个客户报告了这个问题。

是否有可能在同名文件之外的其他文件中出现此异常?也许是一些与权限、可移动媒体或网络驱动器相关的东西?

当尝试创建目录时,IOException ("文件或目录已经存在")

虽然只对一个用户使用这个名称有点过分,但是应该可以检查具有该名称的文件是否存在。

FileInfo myFile = new FileInfo(targetTemplateDirectory);
if (myFile.Exists)
    myFile.Delete();
if (!Directory.Exists(targetTemplateDirectory))
    Directory.CreateDirectory(targetTemplateDirectory);
如果I/O异常是由具有相同名称的文件引起的,那么这可能会解决问题。如果它是由用户引起的,因为"网络名称未知",那么我也不会有任何线索。

我们也有同样的问题,在我们的案例中,很明显这是一个权限问题。我们期待文档中的UnauthorizedAccessException,但这不是我们得到的。

在堆栈中我们有目录。CreateDirectory调用Directory.InternalCreateDirectory.

里面有一张字条:

        //Note that InternalExists may fail due 
        // to Win32 ACL's preventing us from seeing a directory, and this
        // isn't threadsafe. 

有更多关于它的注释,更深入的事实,代码可能会尝试创建已经存在的目录,当它无法看到它