当CreateRectory返回error_access_denied和“不应该不”时
-
30-09-2019 - |
题
我的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