如何检查目录中是否打开了文件?

时间:2019-07-16 19:02:33

标签: c++ file-io operating-system

我正在尝试删除文件夹中的所有文件,但是如果文件保持打开状态,则不会删除。我需要检查文件夹中是否有打开的文件,将其名称写入文本文档,然后关闭打开的文件。由于我经验不足,因此我首先尝试检查同一文件夹中的一个文件,然后再检查同一文件夹中的所有文件,然后再检查其他文件夹中的所有文件。我不想有需要或要求,所以第一步的一些帮助就很好。

我没有大量的编码经验,但是我尝试使用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文件,它仍然表示该文件已打开。

最终,我想创建一个新文件,该文件显示打开了哪些文件以及关闭所有打开的文件。

2 个答案:

答案 0 :(得分:9)

标准C ++向我们提供filesystem library来处理文件和目录(在C ++ 17中已标准化)。但是,据我所知,检查打开的文件不是该库的功能。

用于is_open()的{​​{1}}方法与您要检查的方法完全不同:它告诉您特定的流对象是否处于打开状态(这意味着关联) (带有打开的文件)-并且它不使用操作系统检查打开的文件。通常,这只是一种检查是否已在自己的程序中将其关闭的方法。最多可以确保操作系统没有单方面关闭操作系统端文件访问句柄。因此,您将无法朝那个方向前进。

我也相信,尽管我不是100%肯定,但Boost也没有提供此功能的库。 Boost's filesystem librarystd::fstream几乎相同,因为后者是基于std::filesystem的。

据我所知,您可能需要直接使用特定于操作系统的调用来执行此操作,或者在其他地方寻找提供此功能的库。

如果未找到其他任何内容,则可以利用用户空间中的可用功能跟踪当前的操作方式。有一个名为lsof的实用程序。它在基于Linux,Darwin,FreeBSD和Solaris的某些操作系统上可用(例如,在MacOS上可用)。它保持here。源代码似乎是非常残酷的C。一个勇敢的开发人员可以解析混乱,弄清楚它的作用,提取与您的特定用例相关的部分,并将其重构为合理,易读且简短的C ++函数。我了解到您(OP)可能目前还不愿意这样做,但是-也许其他人正在阅读此答案会受到启发。

答案 1 :(得分:0)

pfiles命令显示进程的打开文件。您可以为所有或某些进程运行它。

但是,Solaris(和UNIX)通常允许您删除打开的文件。打开(但已删除)文件时仍可以对其进行读写,但是没有其他人可以打开同一文件,并且所有进程都关闭文件后,该文件将被删除。