【问题标题】:Access denied when repeatedly create and remove the same directory重复创建和删除同一目录时访问被拒绝
【发布时间】:2013-03-31 07:31:52
【问题描述】:

我刚刚做了一个小测试,我就是这样做的:
我反复创建和删除一个目录,例如 d:\test。我这样做了大约 1000 次,并且在一段时间内访问被拒绝总是会出错。

我的代码是这样写的:

TCHAR szError[MAX_PATH] = {0};
TCHAR lpszPath[MAX_PATH] = _T("d:\\test");
for(int i = 0; i != 1000; i++)
{
    if (!CreateDirectory(lpszPath, NULL))
    {
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), NULL, szError, MAX_PATH, NULL);
        MessageBox(NULL, szError, _T("create directory error"), MB_OK);
        cout << i << endl;
        return 0;
    }
    SetFileAttributes(lpszPath, FILE_ATTRIBUTE_NORMAL);
    if (!RemoveDirectory(lpszPath))
    {
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), NULL, szError, MAX_PATH, NULL);
        MessageBox(NULL, szError, _T("remove directory error"), MB_OK);
        cout << i << endl;
        return 0;
    }   
}

谁能告诉我为什么会发生这个错误以及如何避免这个错误?

【问题讨论】:

  • 我想知道目录删除是不是延迟执行,有时在再次创建目录时还没有完成。
  • 磁盘控制器上有操作系统缓存和缓存,所以您可能是正确的。
  • 如果系统还在缓存,我怎么知道呢?如何避免错误发生?
  • 很可能是一个进程在创建和删除之间打开了窗口中的目录,但还没有关闭它。比如说索引服务。无论如何,我会避免同步磁盘访问功能——它们是难闻的。
  • @Yakk - 是的,索引服务、DropBox 共享或病毒扫描程序可以做到这一点。还有很多其他的。

标签: c++ windows winapi windows-7


【解决方案1】:

如果这是速度问题,您可以考虑在每次创建/删除之间使用休眠功能。

【讨论】:

    【解决方案2】:

    参见 RemoveDirectory 文档; "RemoveDirectory 函数在关闭时标记要删除的目录。因此,在关闭该目录的最后一个句柄之前,不会删除该目录。"

    这意味着,如果某些东西设法为您删除的目录创建了句柄(在创建和删除之间),那么该目录实际上并没有被删除,您会得到“拒绝访问”,

    要解决此问题,请在删除之前重命名要删除的目录。

    【讨论】:

    • 你拯救了这一天!
    猜你喜欢
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 2016-04-05
    • 1970-01-01
    • 2014-01-31
    • 2012-08-13
    相关资源
    最近更新 更多