-->

奇怪的例外与文件访问和explorator窗口(Strange exception with fil

2019-09-23 19:05发布

考虑这个简单的程序:

private static void Main(string[] args)
{
        var directoryName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Directory");

        if (Directory.Exists(directoryName))
            Directory.Delete(directoryName, true);

        Directory.CreateDirectory(directoryName);

        var stream = File.Create(Path.Combine(directoryName, "File")); //throws
        stream.Close();
}

而您只需执行这个程序能正常工作。 如果您浏览的奇怪的事情发生Directory在Windows资源管理器,然后运行。 在这种情况下,我得到UnautorizedAccessException "Access to the path 'C:\Users\rfurman\AppData\Roaming\Directory\File' is denied."

如果这是奇怪的,然后用相同的条件下执行此:

private static void Main(string[] args)
{
        var directoryName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Directory");

        if (Directory.Exists(directoryName))
            Directory.Delete(directoryName, true);

        var value = Directory.Exists(directoryName);

        Console.WriteLine(value);
        Console.ReadKey();
 }

这个程序打印True ,如果Directory是在资源管理器中打开。

我想知道的是为什么发生这种情况以及如何防止这种情况。

我使用Windows 7和.NET 4。

Answer 1:

Directory.Delete内部使用RemoveDirectory赢API中Kernel32 。 什么RemoveDirectory确实是“标记为删除目录”。 在该目录中的最后一个句柄被关闭,删除目录。 我认为,这意味着“后留下的探险该文件夹”

在我的电脑上这种情况不会发生,所以我无法测试,但我怀疑有可能是你的一种方式。 基于NT内核的系统有时允许文件和目录重命名,即使他们是开放的。 我不知道这是允许的确切情况,但我用这个重命名加载DLL文件,并编写一个新的像这样:

File.Rename(@"C:\App\test.dll", @"C:\App\test.dll");
File.Copy(@"C:\App\Update\test.dll-v1.1", @"C:\App\test.dll");

所以,你的代码可能看起来像这样改变之后

var directoryName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Directory");

if (Directory.Exists(directoryName)) {
    var randomExt = ".random"; // generate randomly
    Directory.Move(directoryName, directoryName + randomExt)
    Directory.Delete(directoryName + randomExt, true);
}
Directory.CreateDirectory(directoryName);

var stream = File.Create(Path.Combine(directoryName, "File")); //throws
stream.Close();


Answer 2:

这是一个重复的有点: 离奇的目录中删除SSD驱动器上的行为

探险只是导致文件夹中稍长的延迟删除。 删除目录不是“正是”一个同步操作。 该目录标记为删除但实际删除可能有点滞后。

据我所知这是长久以来一直围绕为NTFS(WIN2K / XP)。



Answer 3:

这个问题让我很吃惊也。 我的选择,这是一个不同的杂牌组装电脑:

    if (Directory.Exists(directoryName))
    {
        Directory.Delete(directoryName, true);
        while (Directory.Exists(directoryName))
            Thread.Sleep(100);
    }

    Directory.CreateDirectory(directoryName);


Answer 4:

在某些情况下,如果你指定的目录中的文件资源管理器中打开,删除方法可能无法将其删除。

参考: Directory.Delete方法



文章来源: Strange exception with file access and explorator windows