QT 如何判断一个文件是否被其他程序占用 墨蓝 2022-09-11 01:17 424阅读 0赞 网上有同学是这样处理的:如果可以对其进行重命名,则没有被占用,反之,该文件被占用。 ### 示例代码 ### #include <QtCore/QCoreApplication> #include <QFile> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString fileName = "C:\\Users\\Kandy\\Desktop\\test.txt"; QString fileNameX = fileName + "x"; QFile file(fileName); bool isExist = file.exists(); qDebug() << "isExist=" << isExist; if (isExist) { bool isOpen = file.isOpen(); qDebug() << "isOpen=" << isOpen; bool wasUsed = false; bool canRename = file.rename(fileName, fileNameX); qDebug() << "canRename=" << canRename; if (canRename == false) { wasUsed = true; } else { file.rename(fileNameX, fileName); } qDebug() << "wasUsed=" << wasUsed; } file.close(); return a.exec(); } 但其实这样做是不妥当的!比如对一个正在被使用的txt文件进行重命名,这是完全没问题的。但是对一个word文档进行重命名,则会失败!但如果都是自己的写的程序A和程序B要对文件F进行“写”互斥,有没有办法判断该txt文件是否被使用呢?答案是可以的! ### QLockFile ### QLockFile 在使用lock() 、tryLock()的时候自动生成一个文件,但QLockFile并没有提供文件读写的其他接口,它自身无法对文件进行读写操作。不过我们可以通过判断由QLockFile生成的文件是否存在,来判断真正要读写的那个文件是否正在被使用。 #include <QtCore/QCoreApplication> #include <QLockFile> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); //要读写的文件A QString fileName = "C:\\Users\\Kandy\\Desktop\\test.txt"; //用来锁定的文件B QString tempFile = fileName + "x"; //读写文件A前锁文件B QLockFile lockfile(tempFile); while (1) { //若锁定成功,则退出循环,执行下一步; //若未锁定成功,则说明文件B被其它地方锁住,即代表文件正在被使用 if (lockfile.tryLock(0)) { break; } } //此处对文件A的读写操作 //open file and read/write... system("pause"); //读写文件A完成后解锁文件B while (1) { lockfile.unlock(); if (!lockfile.isLocked()) { break; } } return a.exec(); }
还没有评论,来说两句吧...