9

我的 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”的代码行(除了提到的脚本)。此外,该应用程序被几千个客户使用,脚本在每台机器上执行,只有一个客户报告了这个问题。

除了同名文件之外,是否有可能发生此异常?也许与权限、可移动媒体或网络驱动器有关?

4

2 回答 2

9

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

FileInfo myFile = new FileInfo(targetTemplateDirectory);
if (myFile.Exists)
    myFile.Delete();

if (!Directory.Exists(targetTemplateDirectory))
    Directory.CreateDirectory(targetTemplateDirectory);

如果 I/O 异常是由同名文件引起的,这可能会解决问题。如果是因为“网络名称未知”是用户造成的,那我也没有头绪。

于 2013-01-09T14:23:59.970 回答
3

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

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

里面有这个注释:

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

有更多关于它的注释,更深入地了解这个事实,代码可能会尝试创建在看不到它时已经存在的目录。

于 2013-05-13T13:00:03.057 回答