2011-10-12 9 views
1

私はそのファイルを開くために使用するCの文字列を持っています。ファイルが存在するかどうかを確認するにはどうすればよいですか?文字列のパスに基づいてCにファイルが存在するかどうかを確認

+1

あなたがチェックしたことがあります? –

+0

あなたはグーグルや何か試しましたか? – Corbin

+0

最終目標が*ファイルを開く*の場合は、ファイルを開こうとするのが一番簡単です。しかし、ファイルが存在するかどうか(開いても問題ありません)、以下の 'access()'や 'stat()'関数を使いたい場合があります。 – poundifdef

答えて

5

機能を使用すると、(アクセスと呼ばれる)

if(access(file_path, F_OK)==0) 
    //file exists 
else 
    // file does not exists 
+1

これはクールだ、私はこの機能が存在するのか分からなかった。 – poundifdef

0

ほとんどの場合、書き込みのためにファイルを開くのが最も簡単です。問題がある場合は、NULLファイルハンドルを戻します。

もちろん、ファイルから読み込みたい場合は、すぐにハンドルをfclose()しないでください。

+1

ファイルが存在するかどうかをテストするためにファイルをオープンする理由はありません。 –

+1

これは、ファイルが存在するかどうかを判断しません。ファイルへの読み取り/書き込みアクセスを必要とせずにファイルが存在する可能性があります。 – dreamlax

+0

あなたは '' errno'をチェックし、 'ENOENT'に設定されているかどうかを確認できます – dreamlax

0

また、これはfopen()が良いです(あなたのプログラムがファイルを読み書きする権限を持っているかどうかを教えてくれていないstat

#include <stdio.h> 
#include <sys/stat.h> 

int main(int argc, char *argv[]) { 

    struct stat s; 

    if (stat("/path/to/file", &s) == -1) { 
     printf("Invalid path\n"); 
    } else { 
     printf("Valid path\n"); 
    } 

    return 0; 

} 

を使用することができますこれはパスが存在するかどうかを示します)。

1

ここでは、誰の回答も(マイナーtweeksで)有効ですが、いくつかの前提があります。まず、実際にファイルをチェックしていれば、それはおそらくファイル/ディレクトリ/ symlink/fifo/socket/etcです。単なるファイルであれば、fopen()、stat()、およびaccess()の各ソリューションは動作しません。

fopen()は、多くのオペレーティングシステム(有効なディレクトリを含む)のほぼすべてのオブジェクトタイプで成功しますが、stat()とaccess()はすべてのオペレーティングシステムのファイルシステムオブジェクトタイプに関係なく成功しますファイルシステムオブジェクトが存在し、現在のセキュリティコンテキスト[ログインしているユーザ]でアクセス可能である)。さらに悪いことに、windowsコンパイラはstatを別々に扱います(msvcのlibにリンクするか、独自のインライン展開を行うため)。関数fopenがnull以外のファイルディスクリプタを返す場合

は、悲しいことに、(ファイルが存在し、あなたがポータブルになりたいかどうかを判断する場合)あなたの最良のアプローチは何かのようです...

#ifdef _WIN32 
    #include <windows.h> 
#else 
    #include <sys/stat.h> 
    #include <unistd.h> 
#endif 

int file_exists(const char* filename) { 
    #ifdef _WIN32 
     HANDLE h = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0); 
     if (h == INVALID_HANDLE_VALUE) 
      return 0; 
     int res = 0; 
     if (GetFileType(h) == FILE_TYPE_DISK) 
      res = 1; 
     CloseHandle(h); 
     return res; 
    #else 
     struct stat st; 
     if (stat(filename, &st) == -1) 
      return 0; 
     return S_ISREG(st.st_mode); 
    #endif 
    return 0; 
} 
関連する問題