こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

投稿日時 - 2007-10-03 23:16:36

QNo.3399080

困ってます

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

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

投稿日時 - 2007-10-03 23:43:38

ANo.1

このQ&Aは役に立ちましたか?

24人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

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

投稿日時 - 2007-10-04 08:13:33

ANo.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 系でも。
・以上。

投稿日時 - 2007-10-04 07:09:08

ANo.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です。

投稿日時 - 2007-10-04 00:45:18

ANo.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

投稿日時 - 2007-10-04 00:34:47

ANo.2

> これは処理系?依存の内容ですか?

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

投稿日時 - 2007-10-04 00:21:50

あなたにオススメの質問