我在使用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文件资源管理器自己锁定了目录。
那么,是否有可用于强制删除的Windows API调用?
还有其他方法可以防止文件删除错误吗?也许在samba服务器上配置?