2017-04-21 130 views
1

我有一个程序多次打开同一个文件。
我想在打开任何文件之前检查此文件当前是否打开,因为我不想多次打开同一个文件。在打开文件之前知道文件当前是否已打开?

enter image description here

是否有一个内置的功能,可以检查,如果该文件是当前打开的或任何其他的方式可以做到这一点?

验证码:

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()); 
+0

你需要更具体一点,你使用哪个Qt组件,如何打开一个文件等。 – Slava

+0

@Slava:我已经更新了我的问题,现在可以查看我的代码。 –

+1

只需维护一个打开的文件列表,将其从关闭信号中删除,并检查它是否已经打开。 – Slava

回答

6

在我看来,你的问题与编程意义上的文件打开没有任何关系,但与你的应用程序逻辑完全相关。您需要在内部保存所有当前打开的文件的列表(在您的GUI显示此类文件的意义上),并检查用户是否打开新文件。

+0

。无论如何你必须保存已经打开的文件名 –

0

普通文件打开,说可以进行追加,根据功能的不同,通常会返回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(); 

在某些文件系统也有共享的开放模式,这将显式地让你同时打开文件,并做你想做,没有产生的错误是什么。

+0

“如果文件已经打开,通常会返回NULL或引发异常”,这一行为取决于操作系统。 – Slava

-1

这里是解决问题的方法: -

IS_OPEN()

范围: 的std :: ofstream的:: IS_OPEN

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

2.it返回流当前是否关联到一个文件

3.it是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; 
    } 

输出:

成功写入到文件

+1

这只适用于OP使用同一个'ofsream'来打开同一个文件两次,但我确定OP要求打开两个完全不相关的流的同一个文件 – user463035818

0

existing question

也可以尝试破解)我不知道将它的工作与否,而是:在

void QFile::setFileName(const QString &name)

功能概述QFile你可以看到,

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

嗯),如果尝试将它在try catch重命名为避免崩溃,如果重命名后,再次将其重命名,然后打开?)所以你可以尝试的东西。

+1

不确定,但我期望docs指的是你不应该在之前打开的'QFile'实例上调用'setFileName',但是如果你使用两个不同的'QFile'实例来打开同一个文件两次,我不认为会有任何异常或者问题 – user463035818

+0

@ tobi303我还没有测试过,但我可以听到你的话语中的逻辑)看起来它的确如你所说的 –

相关问题