【发布时间】:2014-04-11 20:48:38
【问题描述】:
在我正在制作的游戏中,带有文本文件的文件夹代表世界保存,在这个游戏的加载菜单中,我希望有一个删除保存的选项。我目前正在使用此代码来尝试删除保存:
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 拒绝我访问。但是一旦我关闭游戏,文件夹就会被删除。
我知道里面的文件被删除了,因为我尝试了上面没有“rmdir(dir.c_str());”的代码并打开文件夹,所有文件都消失了,如果我“删除”保存然后尝试加载它,也使用上面的代码我没有世界,也没有库存,表明文件已被删除。
我用 removeDirectory 试过了,同样的事情发生了,它还说它被成功删除,没有任何错误。
为什么会这样?我怎样才能避免这种情况,并让它正常工作?
任何帮助将不胜感激。
问题已通过以下代码修复:
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);
}
findClose(hFind);
rmdir(dir.c_str());
【问题讨论】:
-
您应该坚持使用 API 并使用 RemoveDirectory。 msdn.microsoft.com/en-us/library/aa365488%28VS.85%29.aspx 如果删除失败,检查错误返回码并调用GetLastError()。 rmdir() 不会给你这个信息(或者至少,很容易)。
-
您还应该检查
DeleteFile是否成功。 -
使用 RemoveDirectory 会发生同样的事情,除非我多次单击删除,否则不会发生错误,因为程序必须认为该目录已被删除
-
程序运行时删除文件夹后,刷新资源管理器视图后文件夹是否仍然存在?
-
是的,它仍然存在,我用来显示已保存世界的系统是实时的,所以如果我去手动删除一个世界,当我单击删除保存时,我会看到它在程序中消失留在那里,