Winapi 当CreateDirectory返回错误“U访问”和“U拒绝”;不应该';";

Winapi 当CreateDirectory返回错误“U访问”和“U拒绝”;不应该';";,winapi,directory,tmp,getlasterror,Winapi,Directory,Tmp,Getlasterror,我的Win32 app A1(实际上是一组进程)正在尝试使用CreateDirectory在父目录p中创建目录D1。p的路径是TMP环境变量的值,这使p成为一个可能繁忙但通常允许的位置。绝大多数情况下,一切正常,但很少,CreateDirectory失败,GetLastError然后返回ERROR\u ACCESS\u DENIED,其含义在本文中没有记录 我编写了一个测试应用程序A2,它什么也不做,只是在p中以尽可能快的速度重复创建和删除目录D2,我为D2选择了一个愚蠢的长名称,我相信它不会与

我的Win32 app A1(实际上是一组进程)正在尝试使用
CreateDirectory
在父目录p中创建目录D1。p的路径是
TMP
环境变量的值,这使p成为一个可能繁忙但通常允许的位置。绝大多数情况下,一切正常,但很少,
CreateDirectory
失败,
GetLastError
然后返回
ERROR\u ACCESS\u DENIED
,其含义在本文中没有记录

我编写了一个测试应用程序A2,它什么也不做,只是在p中以尽可能快的速度重复创建和删除目录D2,我为D2选择了一个愚蠢的长名称,我相信它不会与任何其他程序使用的名称冲突。每隔几分钟,A2创建D2的尝试只会产生
错误\u访问\u拒绝
失败的一小部分时间

A1在运行期间在p内变得非常繁忙。当A1和A2同时运行时,
ERROR\u ACCESS\u DENIED
失败的周期发生得更频繁,就好像A1和A2在竞争对P的独占访问一样。(我绝对肯定A1不会使用与D2相同的名称。:-)

我有点倾向于把
ERROR\u ACCESS\u DENIED
理解为“几毫秒后再试一次,如果几次尝试后仍不起作用,就放弃”,但我担心[a]在某些情况下,这可能意味着我应该立即注意一些永久性的事情,以及[b]因为我真的不知道发生了什么,可能无法自信地确定合理的时间来继续尝试

有人有这方面的经验吗?有什么建议吗?在这一点上,特别有价值的是关于什么原因的线索,这样我可以更容易地重现问题。

你完全正确。该函数甚至没有将错误_ACCESS _DENIED列为该函数可能的错误代码,因此它很可能是一个bug

我将按照您的建议执行重试/退避策略

换句话说,如果您遇到错误,请在没有延迟的情况下重试最多三次(如果您得到一个非错误返回代码,则显然在此处的任何一点停止),然后再重试最多四次,延迟为(例如,100毫秒、500毫秒、1秒和2秒)

这种策略(我以前使用过)通常可以解决任何暂时的资源短缺问题。如果您在7次尝试和3.6秒以上的时间后仍然无法创建目录,那么您可以放心地假设它不会发生

您的函数可能与(伪代码)一样难看:

但你可能想让它更优雅一点:

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

这似乎在测试场景中工作得相当好。然而,我似乎再也不能在我的真实程序中重现这个问题了。知道是什么原因吗?
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