2012-01-31 22 views
2

私はVisual C++を使用していくつかのディレクトリからファイルを読み込んでいます。そのファイルが存在するかどうかを確認するにはどうすればいいですか? 私が使用する場合:ファイルがC++のいくつかのディレクトリに存在するか確認してください

file.open("file.txt", ios::in); 

ファイルはfstreamのメンバーです。これはファイルが存在しない場合にファイルを作成します。 どうすればそのファイルが存在するかどうかを確認できます。 は(filestd::ifstreamであると仮定すると、ほとんどのシステムで)あなたは

+1

はよろしいですか? 'ios :: in'だけでファイルを作成すべきではありません。他のフラグを 'open()'に渡しているのでしょうか? –

+0

WINAPIは許可されていますか? 'ifstream'などを使ってファイルが存在するかどうかを判断するには不十分です。なぜなら、' open() '試みはパーミッションチェックのために失敗するからです。 – hmjd

+0

@hamidi - フラグについてはわかりませんが、ios :: inは唯一のものです – digvijay

答えて

2
ifstream my_file("file.txt"); 
if (my_file.good()) 
{ 
    // read away 
} 
+0

これは存在しなければまだディレクトリにファイルを作成しています。 – digvijay

4

あなたのコードは、そのファイルが存在しない場合ファイルを作成しませんありがとうございました。

ファイルシステムに固有の同時性があるため、ファイルが存在するかどうかを確認する信頼できる方法はありません。最良の方法は、読み取りアクセス用にファイルを開き、それが成功したかどうかをテストすることです。

if (file.good()) … 
// or simply 
if (file) … 
+0

しかし、私はgood()を使う前に、 open()を使用してください。これは存在しない場合ファイルを作成します... – digvijay

+0

@digvijayいいえ、それはありません。 –

0

ファイルが見つからない場合はファイルを作成しないでください。それは失敗し、後続のfile.is_open()の呼び出しはfalseを返します。

+0

SampleDialog :: fileHandler.open( "file.txt"、ios :: in); if(SampleDialog :: fileHandler.is_open()){MessageBox( "ファイルが開かれました"、NULL、MB_OK); これは私が使用しているコードです。 open()が呼び出された瞬間、ファイルが存在しなければ作成されます。次に、is_open()は常にtrueに評価されます。 – digvijay

1

Windowsで作業している場合は、Windows APIを使用してジョブを実行できます。ここであなたのための簡単なコードスニペットです...成功するためには、file.txtの完全なパスを渡す必要があります。たとえばD:\ MyFolder \ file.txt。

WIN32_FIND_DATA FindFileData; 
HANDLE hFind = INVALID_HANDLE_VALUE; 

hFind = FindFirstFile("D:\MyFolder\file.txt", &FindFileData); 
GetLastError(); 

    if (hFind == INVALID_HANDLE_VALUE) 
      // File not found 
+0

ありがとうございますajit works perfect – digvijay

0

あなたのコードは、次のことを実現することができます。

ifstream file("text.text"); 

if(!file){ 
//handle error/throw exception here 
} 
関連する問題