• ベストアンサー

ファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。 何か組み合わせて作るものなのでしょうか? perlとか便利な演算子があるのですが、C/C++って器用ではないですね。 これは処理系?依存の内容ですか? 私の環境は VC6, VC2005 Windows2000です。

質問者が選んだベストアンサー

  • ベストアンサー
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

int access(const char* path, int mode); int stat(const char* path, struct stat* sb); かな? MSDN を引くと _access_s() を使えとか書いてあるけど。

その他の回答 (5)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★訂正。 ・訂正前⇒『(a)、(b)は既に回答者 No.2、No.3 さんが紹介しています。』  訂正後⇒『(a)、(b)は既に回答者 No.3、No.4 さんが紹介しています。』 ・サンプル4のコメントは   // ファイルが存在する   // ファイルは存在しない  ではなくて   // ディレクトリが存在する   // ディレクトリは存在しない  でした。 ・訂正、終わり。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★Windows 環境限定なら便利関数があります。 ・最初に C/C++ 言語ではファイルやディレクトリの有無を調べる関数はありません。  Windows API 関数(シェル関数)には次のものが用意されています。  (1)PathFileExists…ファイルの有無を調査  (2)PathIsDirectory…ディレクトリの有無を調査  この2つの関数を使えばファイルやディレクトリの存在を確認できます。 ・他にも API 関数を利用すれば同等な処理を行えます。  (a)GetFileAttributes…属性を調べるを利用する  (b)FindFirstFile………ファイル検索を利用する  (c)CreateFile…………OPEN_EXISTING定数を指定しても有無を調べられる  どの方法を使っても Windows 環境限定でしか動きませんが一応出来ます。  (a)、(b)は既に回答者 No.2、No.3 さんが紹介しています。  下にサンプルを載せておきます。 サンプル1: if ( PathFileExists("sample.txt") ){  // ファイルは存在する } else{  // ファイルは存在しない } サンプル2: if ( PathIsDirectory("C:\\Documents and Settings\\*****\\My Documents") ){  // ディレクトリは存在する } else{  // ディレクトリは存在しない } サンプル3: FILE *fp; if ( (fp = fopen("sample.txt","r")) != NULL ){  fclose( fp );  // ファイルが存在する } else{  // ファイルは存在しない } サンプル4: FILE *fp; if ( (fp = fopen("C:\\Documents and Settings\\*****\\My Documents\\nul","r")) != NULL ){  // ファイルが存在する  fclose( fp ); } else{  // ファイルは存在しない } 解説: ・サンプル1、2 は Win32 API 関数を利用した場合です。  ファイルやディレクトリの有無を調査する専用のシェル関数です。  この関数を利用するには shlwapi.h ヘッダをインクルードして  ShLwApi.Lib ライブラリをリンクして下さい。 ・サンプル3、4 は C/C++ 言語でも使えるような記述です。  昔から C 言語などでファイルの有無を調べるにはこの方法が良く使われます。  ディレクトリの方は NUL というデバイス・ファイル名を用いてチェックできます。  なおディレクトリの方は MS-DOS、Windows 系は動作確認していますが他の OS でも  利用できるかは分かりません。使えたらラッキーですね。Unix、Linax 系でも。 ・以上。

noname#50176
noname#50176
回答No.4

こんな方法もあります。 <サンプル> #include <windows.h> int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCommandLine, int cmdShow) { HANDLE hFind; WIN32_FIND_DATA fd; hFind=FindFirstFile(パス名,&fd); if (FindNextFile(hFind,&fd) || !lstrcmpi(ファイル名,fd.cFileName)) MessageBox(0,"指定のパスは存在します","結果",MB_ICONINFORMATION); else MessageBox(0,"指定のパスは存在しません","結果",MB_ICONERROR); FindClose(hFind); return 0; } 例えば、「C:\WINDOWS\NOTEPAD.EXE」のようにファイル名なら hFind=FindFirstFile("C:\\WINDOWS\\NOTEPAD.EXE",&fd); if (FindNextFile(hFind,&fd) || !lstrcmpi("NOTEPAD.EXE",fd.cFileName)) 「C:\WINDOWS\」のようにディレクトリパスならば hFind=FindFirstFile("C:\\WINDOWS\\*.*",&fd); if (FindNextFile(hFind,&fd) || !lstrcmpi("",fd.cFileName)) でOKです。

  • SHOO-3
  • ベストアンサー率56% (28/50)
回答No.3

環境を Windows に限定してよいのであれば、 GetFileAttributes でチェックすることができます。 以下に例を上げますのでご参考になさってください。 ---- #include <iostream> #include <windows.h> using namespace std; int main(){ switch(::GetFileAttributes(TEXT("filename"))){ case FILE_ATTRIBUTE_DIRECTORY: cout << "is folder" << endl;break; case -1 : cout << "not found" << endl;break; default : cout << "is file" << endl;break; } return 0; }

参考URL:
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpfileio/html/_win32_getfileattributes.asp
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> これは処理系?依存の内容ですか? ディレクトリに関してはそうです。 ファイルに関しては、いったん読み込みモードでオープンして、成功することを確認すれば、一応、処理系に依存せずに実現できます。ただし、細かな話をし出すと、これだけでは不十分です。

関連するQ&A

専門家に質問してみよう