【问题标题】:A way to know if the file currently is open before open it again?在再次打开之前知道文件当前是否打开的方法?
【发布时间】:2017-04-21 13:27:27
【问题描述】:

我有一个程序可以多次打开同一个文件。
我想在打开任何文件之前检查该文件当前是否打开,因为我不想多次打开同一个文件。

是否有一个内置函数可以检查文件当前是否打开或任何其他方式可以做到这一点?

守则:

QString openFilePath = QFileDialog::getOpenFileName(this->mainWindow, "Open File");
if(openFilePath == ""){
    return;
}
QFile openFile(openFilePath);
if(!openFile.open(QFile::ReadWrite)){
    QMessageBox::critical(this->mainWindow, "Can't Open file", "Can't access to the file.");
}
QTextStream fileContent(&openFile);
QFileInfo fileInfo(openFile);
this->createEmptyFile(fileInfo.fileName());
this->txtEditor->setText(fileContent.readAll());

【问题讨论】:

  • 您需要更具体一些,您使用的 Qt 组件、打开文件的方式等。
  • @Slava:我已经更新了我的问题,你现在可以查看我的代码了。
  • 只需维护一个打开文件的列表,在关闭信号时将其从那里删除,并检查它是否已打开。

标签: c++ qt qt5


【解决方案1】:

在我看来,您的问题实际上与程序意义上的文件打开无关,而是与您的应用程序逻辑完全相关。您需要在内部保留所有当前打开的文件的列表(在您的 GUI 显示此类文件的意义上),并检查用户是否打开了新文件。

【讨论】:

  • 确实如此。无论如何,您必须保存已打开的文件名
【解决方案2】:

existing question

你也可以尝试破解)我不知道它是否有效,但是:在

void QFile::setFileName(const QString &name)

功能概览QFile可以看到

如果文件已经打开,则不要调用此函数。

嗯)如果尝试在try catch 中重命名它以避免崩溃,如果重命名完成,再次重命名并打开?)所以你可以尝试。

【讨论】:

  • 不确定,但我希望文档提到您不应该在之前打开的 QFile 实例上调用 setFileName,但我认为如果您使用两个不同的 QFile 实例打开同一个文件两次
  • @tobi303 我还没有测试过,但我能听出你的话中的逻辑)似乎它是按你说的那样工作
【解决方案3】:

常规文件打开,比如追加,取决于函数,如果文件已经打开,通常会返回 NULL 或引发异常。有些无状态文件系统可能无法使用这种方法。

std::fstream fs;
try {
    fs.open("lk.txt", std::fstream::in | std::fstream::out | std::fstream::app);
    fs << "We're way beyond the boundaries of the Pride Lands.";
} catch (const std::ios_base::failure &ex) {
    // Something happened
    std::cerr << ex.what() << std::endl;
}
fs.close();

在某些文件系统中,还有共享打开模式,这将明确允许您同时重新打开文件并执行您想要的操作,而不会产生错误。

【讨论】:

  • “如果文件已经打开,通常会返回 NULL 或引发异常”这种行为取决于操作系统。
【解决方案4】:

这里是您问题的解决方案:-

is_open()

范围: std::ofstream::is_open

1.it 检查文件是否打开?

2.它返回流当前是否与文件相关联

3.fstream的公共成员函数。

4.参数 -none

示例代码:

    #include <iostream>    
    #include <fstream>      // std::ofstream

    int main () 
    {
      std::ofstream ofs;
      ofs.open ("hye.txt");
      if (ofs.is_open())
      {
        ofs << "hellow world";
        cout << "successfully written to file";
        ofs.close();
      }
      else
      {
        cout << "Error opening file";
      }
      return 0;
    }

输出:

成功写入文件

【讨论】:

  • 这只有在 OP 使用同一个 ofsream 两次打开同一个文件时才有效,但我很确定 OP 要求用两个完全不相关的流打开同一个文件跨度>
猜你喜欢
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多