我正在尝试删除文件夹中的所有文件,但是如果文件保持打开状态,则不会删除。我需要检查文件夹中是否有打开的文件,将其名称写入文本文档,然后关闭打开的文件。由于我经验不足,因此我首先尝试检查同一文件夹中的一个文件,然后再检查同一文件夹中的所有文件,然后再检查其他文件夹中的所有文件。我不想有需要或要求,所以第一步的一些帮助就很好。
我没有大量的编码经验,但是我尝试使用fstream和(name.is_open)。我可能错误地使用了它们,所以我还没有排除它们。
// ifstream::is_open
#include <iostream> // std::cout
#include <fstream> // std::ifstream
void checkFiles() {
int done = 0;
while(done != 1){
std::cout << "Enter 0 for continue or 1 for done: ";
std::cin >> done;
std::ifstream ifs ("test.txt");
if (ifs.is_open()) {
// Print that file is open, then close
std::cout << "File is open\n";
std::ifstream.close():
}
else {
std::cout << "File not open\n";
}
}
对于这段代码,如果文件已打开,则应显示“文件已打开”。 如果没有,它应该显示“文件未打开”
即使我强行退出.txt文件,它仍然表示该文件已打开。
最终,我想创建一个新文件,该文件显示打开了哪些文件以及关闭所有打开的文件。
答案 0 :(得分:9)
标准C ++向我们提供filesystem library来处理文件和目录(在C ++ 17中已标准化)。但是,据我所知,检查打开的文件不是该库的功能。
用于is_open()
的{{1}}方法与您要检查的方法完全不同:它告诉您特定的流对象是否处于打开状态(这意味着关联) (带有打开的文件)-并且它不使用操作系统检查打开的文件。通常,这只是一种检查是否已在自己的程序中将其关闭的方法。最多可以确保操作系统没有单方面关闭操作系统端文件访问句柄。因此,您将无法朝那个方向前进。
我也相信,尽管我不是100%肯定,但Boost也没有提供此功能的库。 Boost's filesystem
library与std::fstream
几乎相同,因为后者是基于std::filesystem
的。
据我所知,您可能需要直接使用特定于操作系统的调用来执行此操作,或者在其他地方寻找提供此功能的库。
如果未找到其他任何内容,则可以利用用户空间中的可用功能跟踪当前的操作方式。有一个名为lsof
的实用程序。它在基于Linux,Darwin,FreeBSD和Solaris的某些操作系统上可用(例如,在MacOS上可用)。它保持here。源代码似乎是非常残酷的C。一个勇敢的开发人员可以解析混乱,弄清楚它的作用,提取与您的特定用例相关的部分,并将其重构为合理,易读且简短的C ++函数。我了解到您(OP)可能目前还不愿意这样做,但是-也许其他人正在阅读此答案会受到启发。
答案 1 :(得分:0)
pfiles
命令显示进程的打开文件。您可以为所有或某些进程运行它。
但是,Solaris(和UNIX)通常允许您删除打开的文件。打开(但已删除)文件时仍可以对其进行读写,但是没有其他人可以打开同一文件,并且所有进程都关闭文件后,该文件将被删除。