使用C ++

时间:2017-10-19 13:52:37

标签: c++ windows qt file locking

我在使用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文件资源管理器自己锁定了目录。

那么,是否有可用于强制删除的Win​​dows API调用?

还有其他方法可以防止文件删除错误吗?也许在samba服务器上配置?

0 个答案:

没有答案