2017-04-21 34 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を返します。ファイルが既に開いている場合は例外が発生します。"この動作はOSによって異なります。 – Slava

-1

はあなたの問題を解決する: -

IS_OPEN()

範囲: のstd :: ofstreamの:: IS_OPEN

1.itチェックファイルが開いている場合か否か?ストリームが現在ファイル

3.itに関連しているかどうか

2.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が同じファイルを2回開くのに同じOPの 'ofsream'を使用している場合にのみ動作しますが、OPが2つの完全に無関係なストリームで同じファイルを開くように要求していると確信しています – user463035818

0

existing question

も私はそれが動作するかどうかだろう知らない)ハックを試すことができますが、:

void QFile::setFileName(const QString &name)

機能の概要QFileにあなたが

がないことを見ることができますファイルがすでに開かれている場合は、この関数を呼び出します。

うーん)はどのようなクラッシュを回避し、名前の変更が行われた場合、再度名前を変更してオープンするtry catchでその名前を変更しようとすると?)そう、あなたが試すことができます。

+1

わかりませんが、 docsは、前に開かれた 'QFile'インスタンスで' setFileName'を呼び出すべきではないと言っていますが、2つの別々の 'QFile'インスタンスを使って同じファイルを2回開くと例外や問題はないと思います。 – user463035818

+0

@ tobi303私はまだそれをテストしていないが、私はあなたの言葉で論理を聞くことができます)それは実際に –

関連する問題