我在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
”的代码行(除了上面提到的脚本)。此外,该应用程序被数千名客户使用,该脚本在每台机器上执行,只有一位客户报告了此问题。
除了具有相同名称的文件之外,是否有可能发生此异常?也许与权限,可移动媒体或网络驱动器相关的东西?
答案 0 :(得分:9)
虽然仅为一个用户提供此功能会有点过分,但应该可以检查是否存在具有该名称的文件。
FileInfo myFile = new FileInfo(targetTemplateDirectory);
if (myFile.Exists)
myFile.Delete();
if (!Directory.Exists(targetTemplateDirectory))
Directory.CreateDirectory(targetTemplateDirectory);
这可能会解决问题,因为I / O异常是由具有相同名称的文件引起的。如果它是由用户引起的,因为“网络名称未知”,那么我也不会有任何线索。
答案 1 :(得分: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.
关于它的更多注释,更深入地了解这个事实,代码可能会尝试创建当它无法看到它时已存在的目录。