我从C ++ / Qt应用程序删除文件时遇到一些麻烦。 当用户删除什么工作会话时,应从磁盘中删除所选的工作会话目录。
但有时,删除失败可能是由于锁定(在另一个应用程序中打开了目录中的文件)。
但是,由于工作会话存储在网络驱动器上(在Linux服务器上,在Windows驱动器号上使用samba挂载),因此我怀疑还有与网络相关的锁。
为了避免出现问题,我使用了一个小循环来删除文件:
QFile::remove(absoluteFileName);
bool result = (QFile::exists(absoluteFileName) == false);
// The file system may need some time to react, wait 100ms * 50 = 5 s for operation to complete
for (int i=0; (i<50)&&(result==false); i++)
{
QThread::msleep(100);
result = (QFile::exists(absoluteFileName) == false);
}
if (result == false)
{
qCCritical(c3x::Log::General()) << "Unable to delete file : " << absoluteFileName;
return false;
}
这样,如果文件删除失败,我将每100ms重试一次。 这解决了大约90%的文件删除问题。
但是我仍然有麻烦:即使当前没有打开任何文件,我的程序也无法删除该目录。
使用“ Unlocker”工具,我可以看到Windows File Explorer在目录本身上具有锁定。
那么,有没有可以用来强制删除的Windows API调用?
还有其他方法可以防止文件删除错误吗? 也许在samba服务器配置中?