在我制作的游戏中,文本文件夹里面代表世界扑克,在这个游戏的加载菜单中我想要一个选项来删除保存。 我正在使用此代码来尝试删除保存:
hFind = FindFirstFile((dir+"/*").c_str(),&FindFileData); if (hFind){ do{ string s = FindFileData.cFileName; if(s.find('.')){//prevents prossesing of "." and ".." DeleteFile((dir+"/"+s).c_str()); } }while(FindNextFile(hFind,&FindFileData)); CloseHandle(hFind); } rmdir(dir.c_str());
这些文件夹中唯一的东西是3个文本文件,所以这个代码应该是足够的,但事实并非如此。 会发生什么事是目录中的所有文件都被删除,但不是文件夹,如果我尝试手动删除这个文件夹,或者在程序运行时以任何方式编辑它,windows会拒绝我访问。 但是一旦closures游戏,文件夹就会被删除。
我知道里面的文件被删除,因为我尝试了上面的代码与“rmdir(dir.c_str());” 并打开文件夹,所有的文件都不见了,也用上面的代码,如果我“删除”保存,然后尝试加载它,我没有世界,没有库存,表明文件已被删除。
我用removeDirectory试了一下,发生了同样的事情,它也说它已经成功删除,没有任何错误。
java在Windows中删除目录
MinGW与COLORREF和RGB拧紧
Windows 8上的lockAndInitHandle错误
为什么会这样呢? 我怎样才能避免这一点,并使其正常工作?
任何帮助将不胜感激。
该问题是用以下代码fixxed:
hFind = FindFirstFile((dir+"/*").c_str(),&FindFileData)); CloseHandle(hFind); } findClose(hFind); rmdir(dir.c_str());
如何使用函数GetStorageFileName将训练文件添加到registry?
安装Python 3后安装Python 2.7
查找屏幕分辨率创build线程问题
什么是Windows上最好的免费Scheme实现?
根据RemoveDirectory文档:
RemoveDirectory函数在关闭时标记要删除的目录。 因此,直到该目录的最后一个句柄关闭,该目录才被删除。
可能你的程序有目录作为它当前的工作目录,或者也许还有一个句柄来打开它。
在Windows中,rmdir是一个调用本地窗口函数的可比较函数,所以它将表现相同。
根本问题是代码在FindFirstFile返回的句柄上调用CloseHandle而不是FindClose 。
但是代码有更多的错误。 为了帮助未来的访问者,这是正确的代码。
HANDLE hFind = FindFirstFile((dir + "\*").c_str(),&FindFileData); // See 1 below if (hFind != INVALID_HANDLE_VALUE) { // 2 do { if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) { // 3 const std::string s = dir + "\" + FindFileData.cFileName; DeleteFile(s.c_str()); } } while (FindNextFile(hFind,&FindFileData)); // 4 FindClose(hFind); // 5 } RemoveDirectory(dir.c_str()); // 6
Windows路径使用而不是/作为分隔符。 许多API都可以接受,但最终你会遇到一个不这样做的,所以最好使用正确的一个。
FindFirstFile在失败时返回INVALID_HANDLE_VALUE(非NULL)。 由于INVALID_HANDLE_VALUE不为零,因此不能简单地测试if (hFile) { ... } 。
API枚举文件和目录。 旧的代码试图过滤掉. 和..目录不正确,这可能导致它跳过一些文件,并尝试在其他目录上使用DeleteFile。 跳过所有目录更简单(也更容易理解)。
不要在FindFirstFile返回的句柄上调用CloseHandle。
请在由FindFirstFile返回的句柄上调用FindClose,但是只有在从FindFirstFile获得有效句柄的情况下才这样做。
只要你使用特定于Windows的API,你也可以一致地使用它们,而不是像rmdir一样使用库包装器。 库包装器有时会引入令人惊讶的限制或行为,虽然我认为在这种情况下rmdir会正常工作。
这仍然留下了一个重大的问题:它不处理路径中的Unicode(它需要您编译的ANSI限制在项目的其他部分的Unicode处理)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。