【问题标题】:Detect if file is open in C++检测文件是否在 C++ 中打开
【发布时间】:2014-01-21 12:33:39
【问题描述】:

在 C++ 中有什么方法可以检测文件是否已在另一个程序中打开?
我想删除和重写一些文件,但如果文件被打开,我想显示一条错误消息。我正在使用 Windows 操作系统。

【问题讨论】:

标签: c++ windows


【解决方案1】:

CreateFile API function可以使用CreateFile API function,共享模式为NULL,打开文件独占使用。

【讨论】:

    【解决方案2】:

    根据“是文件打开查询”的结果采取行动是一种竞争条件(查询返回false,然后程序会在您的程序尝试删除文件之前打开文件例如)。

    尝试使用DeleteFile() 删除文件,如果失败,则使用GetLastError() 显示文件删除失败的原因。请参阅System Error Codes 获取错误代码列表(ERROR_SHARING_VIOLATION 声明 “该进程无法访问该文件,因为它正被另一个进程使用。”

    【讨论】:

    • 如果我自己不打开文件,在什么情况下可以被程序打开?这让我有点困惑。可以举几个例子吗?
    • @AlexandraC,我不确定您所说的“如果我自己不打开它”是什么意思?如果文件存在,任何程序都可以根据需要尝试打开它。一个明智的例子是病毒检查器,它可以定期打开文件来检查内容。
    • 感谢您的回答,非常有帮助。我想知道为什么程序要打开文件。是否有任何文档可供我阅读有关此主题的更多信息?
    【解决方案3】:

    您可以使用is_open() 来检查文件是否打开。如果是,您可以关闭它或执行其他操作。 这是一个例子:

    int main () 
    {
    
      fstream filestr;
      filestr.open ("test.txt");
    
      if (filestr.is_open())
      {
    
       filestr << "File successfully open";
       filestr.close();
    
      }
    
      else
      {
    
       cout << "Error opening file";
    
      } 
    
     return 0;
    }
    

    【讨论】:

    • 这不会检查文件是否在其他程序中打开,只检查您自己是否成功打开。
    【解决方案4】:
    #include <iostream>     // std::cout
    #include <fstream>      // std::ofstream
    
    int main () {
      std::ofstream ofs;
      ofs.open ("example.txt");
      if (ofs.is_open())
      {
        ofs << "anything";
        std::cout << "operation successfully performed\n";
        ofs.close();
      }
      else
      {
        std::cout << "Error opening file";
      }
      return 0;
    }
    

    【讨论】:

    • ...然后其他进程会打开close 之间的文件,然后您尝试将其删除...
    • @molbdnilo:我没有完全理解。是两个进程同步访问文件的问题吗?
    • 是的,请参阅 hmjd 的答案。你的测试没有意义,因为它可以在之后的任何时候失效。 (假设一个抢先式多任务操作系统。)
    【解决方案5】:

    你可以使用remove("filename")函数。

    【讨论】:

      猜你喜欢
      • 2015-08-30
      • 1970-01-01
      • 2011-10-21
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多