我的Win32 App A1(实际上是流程的集合)正在尝试使用 CreateDirectory 在父目录中创建目录D1。通往p的路径是 TMP 环境变量,这使得P成为潜在繁忙但通常允许的地方。绝大多数情况下,一切都很好,但是很少 CreateDirectory 失败和 GetLastError 然后返回 ERROR_ACCESS_DENIED, ,在这种情况下的含义未记录。

我编写了一个测试应用程序A2,该应用程序除了反复创建和删除D2的目录D2尽可能快,我选择了D2的愚蠢的长名,我确信我不会与任何其他程序都使用的任何其他程序相撞。每隔几分钟,就有一秒钟的一小部分,在此期间A2尝试创建D2产量 ERROR_ACCESS_DENIED 失败。

A1在运行期间在P中很忙。当A1和A2同时运行时 ERROR_ACCESS_DENIED 失败发生的频率更高,好像A1和A2正在竞争专用访问P。(我绝对确定A1不使用与D2相同的名称。:-)

我有点愿意接受 ERROR_ACCESS_DENIED 意思是“在几毫秒内再次尝试,如果在几次尝试后不起作用,请放弃”,但是我担心[A]在某些情况下,这可能意味着我应该立即注意的某种东西,而且[b]因为我真的不知道发生了什么,因此可能无法自信地建立合理的时间来继续尝试。

有人有这个经验吗?有建议吗?在这一点上,特别有价值的是导致这一点的线索,因此我可以更轻松地重现问题。

有帮助吗?

解决方案

你死了。这 文档 甚至不会列表error_access_denied作为该功能的可能的错误代码,因此很可能是一个错误。

我会按照您的建议来实施重试/退缩策略。

换句话说,如果您遇到了该错误,请不延迟再尝试三次(显然,如果您获得了非错误返回代码,请在此处任何时候停止),然后多达四次,然后使用延迟(例如, 100毫秒,500毫秒,1秒和2秒)。

这种策略(我以前使用过)通常会围绕任何临时资源短缺。如果您仍然无法在7次尝试和3.6之后创建目录+ 几秒钟,您可能可以安全地认为这不会发生。

您的功能可能与(伪代码)一样丑陋:

def createMyDir (dirname):
    if createDir (dirName) return true;
    if createDir (dirName) return true;
    if createDir (dirName) return true;
    sleep (100)
    if createDir (dirName) return true;
    sleep (500)
    if createDir (dirName) return true;
    sleep (1000)
    if createDir (dirName) return true;
    sleep (2000)
    return createDir (dirName);

但是您可能希望您使其更加优雅:

def createMyDir (dirname):
    delay = pointer to array [0, 0, 0, 100, 500, 1000, 2000, -1]
    okay = createDir (dirName)
    while not okay and [delay] not -1:
        if [delay] not 0:
            sleep ([delay])
        delay = next delay
        okay = createDir (dirName)
    return okay
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top