2017-04-21 192 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我還沒有測試過,但我可以聽到你的話語中的邏輯)看起來它的確如你所說的 –