2009-09-05 4 views
61

fstream my_file( "test.txt")がありますが、test.txtが存在するかどうかわかりません。存在する場合は、私もそれを読むことができるかどうかを知りたい。どうやってするか?ファイルが存在し、C++で読み込み可能かどうかをチェックする方法?

私はLinuxを使用しています。

+0

れます"可能な重複"。私は子供の子供たちがこの質問をしてくれるのだろうか? – SChepurin

答えて

80

私はおそらくとなるだろう:ストリームから読み込み可能な状態であれば

ifstream my_file("test.txt"); 
if (my_file.good()) 
{ 
    // read away 
} 

good方法をチェックします。

+12

この方法では、それが存在するかどうかをチェックするだけでなく、実際に開くことができます。 – xtofl

+1

ええ、それは本当です。私はOPの質問を読んだが、ファイルは既に開かれていたが、間違っている可能性がある。 –

10

どのオペレーティングシステム/プラットフォームですか?

Linux/Unix/MacOSXでは、fstatを使用できます。

Windowsでは、GetFileAttributesを使用できます。

通常、標準のC/C++ IO関数では、これを実行するポータブルな方法はありません。

+1

なぜ、あなたはいつもfopenでファイルを開こうとすることができ、0を返すと、ファイルが存在しないことを移植可能に推論できます。 – Blindy

+1

fstatは 'sys/stat.h'でもウィンドウで利用できます。 – xtofl

8

あなたがUNIXの場合は、access()が読めるかどうかを伝えることができます。しかし、ACLが使用されている場合は、より複雑になります。この場合、ifstreamでファイルを開き、読み込みを試みるのが最善です。ACLが読み込めない場合、ACLが読み込みを禁止する可能性があります。

+1

access()は、time-of-check-to-use-useバグを紹介する素晴らしい方法です。 – bk1e

23

Boost.Filesystemを使用することがあります。それはboost::filesystem::exist機能を持っています。

読み取りアクセス権を確認する方法についてはわかりません。 Boost.Filesystemも見ることができます。しかし、実際にファイルを読み込もうとするよりも、他の(移植可能な)方法はないでしょう。

+0

ファイルシステムは、ウィンドウ上で非常に長いパス(> 256)を処理しますか?私たちは最近、非UnicodeウィンドウAPIが最大256文字を持つという問題に直面しました。 –

+0

私は分かりません。ドキュメント(私の答えのリンクにある)をチェックインするかもしれませんが、あなたがそれを見つけられるかどうかは分かりません。またBoostニュースグループで尋ねるかもしれません。別の方法は、単にそれをチェックすることです。 –

+0

@Richard Corden関数boost :: filesystem :: create_directoriesで非常に長いパスをチェックしました。 ANSIバージョン(char用)は、長いパスに与えられた場合に例外をスローしました(しかし、制限は何とか260に等しいMAX_PATHではなく約250に達しました)。 UNICODE版(wchar_t用)は、ANSIバージョンと同じくらい多くのフォルダを作成してスローせずに正常に返すので、ジョブを実行しなかっただけでなく、エラーを報告しませんでした。私は他の機能とはどういうものか分かりませんが、今も悪い行動をしている可能性があります。 –

0

Windowsでfstatを使用しているかどうかについては、わかりません。 Microsoftから、ファイルは既に開いている必要があります。 Statがうまくいくはずです。

2

最終的にはLinuxを使用しているというポスターを知っていますが、誰もWindows用APIコールPathFileExists()を言及していないことに驚いています。

Shlwapi.libライブラリとShlwapi.hヘッダーファイルを含める必要があります。

#pragma comment(lib, "shlwapi.lib") 
#include <shlwapi.h> 

関数はBOOL値を返し、そうのように呼ぶことができる。

if(PathFileExists("C:\\path\\to\\your\\file.ext")) 
{ 
    // do something 
} 
+0

PathFileExists()が信頼できないと主張していました:http://mfctips.com/tag/file-exists/ –

3

C++ 11は、それが代わりgood()の暗黙operator boolを使用することが可能なので:

ifstream my_file("test.txt"); 
if (my_file) { 
    // read away 
} 
関連する問題