c++ - 重复创建和删除同一目录时拒绝访问

标签 c++ windows winapi windows-7

我刚刚做了一个小测试,我是这样做的:
我反复创建和删除一个目录,例如 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;
    }   
}

谁能告诉我为什么会出现这个错误,我该如何避免这个错误?

最佳答案

参见 RemoveDirectory 文档; “RemoveDirectory 函数将目录标记为在关闭时删除。因此,直到目录的最后一个句柄关闭后,目录才会被删除。”

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

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

关于c++ - 重复创建和删除同一目录时拒绝访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15892295/

相关文章:

c++ - Firebird 数据库的 IBPP 接口(interface)体验

windows - 如何从客户端确定联合名称和 AD FS 颁发者 url 端点?

c++ - 调用远程设置 EAX 和 ECX 的函数

windows - 如何使用 NAudio 获取当前使用 powershell 播放音频的应用程序的名称?

c++ - 子类编辑控件的输入验证只接受 float

c++ - 编译 TCL-DLL 包装器时的问题

c++ - 有什么方法可以在 DelphiInterface 上实现 dynamic_cast 以获得底层对象类?

c++ - 在 C++ 中重载比较运算符,如何与 const 参数进行比较?

c++ - 将文件写入 USB 内存棒会导致意外删除时文件损坏/锁定

windows - 将操作系统代码映射到同一逻辑空间的原因?