gpt4 book ai didi

winapi - 是什么导致 CreateDirectory 返回 ERROR_ACCESS_DENIED?

转载 作者:行者123 更新时间:2023-12-01 04:16:28 42 4
gpt4 key购买 nike

another question ,我们确定是的,CreateDirectory偶尔会因未记录的 GetLastError 而失败ERROR_ACCESS_DENIED 的值,并且处理这种情况的正确方法可能是再试几次。实现这样的算法很容易,但是当你不知道如何重现它时,测试它就不是那么容易了。

我不需要理论来解释为什么会发生这种情况。这可能是 Windows 中的一个错误,是的。它也可能是设计使然。最终,在这一点上,这并不重要,因为 Microsoft 发布了该行为,而我必须应对。

我也不需要解释多任务操作系统理论以及 Windows 通常如何实现它。我以编写系统软件为生。其他我了解的很少。

我现在需要的是一种可靠的方法来重现失败,以便我可以为应对的代码编写测试用例。这是我迄今为止尝试过的:


  • 我编写了测试程序 P1,它缓慢而反复地枚举潜在父级的内容。同样,我编写了测试程序 P2,它除了反复尝试在潜在的父目录中删除和创建目录之外什么都不做。我认为长时间保持枚举打开可能会使问题更容易出现。单独运行 P2 会偶尔产生故障(每隔几分钟大约 10 毫秒)。同时运行 P1 和 P2 似乎不会使失败更频繁或更长时间。

  • 我同时运行了两个 P2 实例,这似乎不会使失败变得更频繁或更长时间。

  • 我修改了 P2 以便它可以创建除目录之外的文件,并且与 P1 同时运行它似乎不会使失败更频繁或更长时间。

  • 我同时使用不同的参数运行 P1 和 P2 的多个实例,这似乎不会使失败变得更频繁或更长时间。

  • 我编写了测试程序 P3,它将项目移入和移出潜在的父项,并与 P2 同时运行 P3,这似乎不会使失败变得更频繁或更长时间。

  • 还有其他想法吗?

    最佳答案

    让我首先仔细检查我是否理解这个问题。如果你运行类似下面的代码片段,你希望它最终会失败,对吧?

    while (true)
    {
    System.IO.Directory.CreateDirectory( ".\\FooDir" );
    System.IO.Directory.Delete( ".\\FooDir" );
    }

    如果您的应用程序是系统上运行的唯一具有打开该文件的句柄的应用程序,那么这感觉就像一个错误。因此,了解操作系统版本会有所帮助。

    另一方面,如果系统中还有其他东西使 handle 保持打开状态一小会儿,那么这是否是一个错误就会变得更加模糊。试图盲目探索文件和目录的数量可能会让您感到惊讶。例如,一个天真的索引器可能会走进那个目录,枚举它,寻找要索引的文件等等——如果你与他发生冲突,blammo。一个类似的简单的反病毒过滤器,或其他一些文件系统过滤器,也可能会戳它(在这种情况下,它仍然感觉像是一个错误)。

    我们在操作系统中做了一些小事情来尝试提供这样的服务来让您摆脱困境。如果您关闭索引器,如果您关闭任何防病毒软件,任何反恶意软件,它是否会重现?我们可以从那里开始,希望我们会发现更新的部分已经修复了它(我知道,该声明中有很多假设)。

    另一个相对有趣的琐事是 ERROR_ACCESS_DENIED 是一个 Win32 错误,它映射到系统中的多个底层状态(例如,参见 this article)。因此,如果我们能更深入地挖掘,我们也许能够找出文件系统试图告诉应用程序的内容(如果它不仅仅是访问被拒绝)。

    我们可能最终会讨论您是否可以在野外假设您的应用程序是唯一戳穿您的文件和目录的东西。你大概可以猜到那个人会去哪里。

    关于winapi - 是什么导致 CreateDirectory 返回 ERROR_ACCESS_DENIED?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3570618/

    42 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com