opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

UNIXでファイルの存在を確かめてみた

UNIXでファイルの存在を確認する方法をぐぐってわかったことをまとめておく。
とりあえずWindowsにはファイルやディレクトリの存在を確認してくれる便利なAPIがあることがわかった。ではUNIXにはないのかというとWindows程簡単には使えないが、statというのを使うとできるようだ。

とりえあず以下のような関数を作ってみた

#define FILE_EXIST 1
#define DIR_EXIST 2
#define NO_FILE_DIR_EXIST 0

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

int fileE(char* filename){
	struct stat st;
	if(stat(filename,&st) != 0){
		return NO_FILE_DIR_EXIST;
	}else{
		mode_t m = st.st_mode;
		if(S_ISDIR(m)){
			return NO_FILE_DIR_EXIST;
		}else{
			return FILE_EXIST;
		}
	}
}

int dirE(char* dirname){ 
	struct stat st;
	if(stat(dirname,&st) != 0){
		return NO_FILE_DIR_EXIST;
	}else{
		mode_t m = st.st_mode;
		if(S_ISDIR(m)){
			return DIR_EXIST;
		}else{
			return NO_FILE_DIR_EXIST;
		}
	}
}

dirEはディレクトリPATHを渡して存在すればDIR_EXISTを返す(マクロ)。
fileEはファイルの存在を確認する。

struct stat st; として構造体の変数を作る。
stat関数を使って初期化する。この関数の戻り値で0以外が返ればファイルは存在しないことになる。

if(stat(filename,&st) != 0){
   return -1;
}

みたいな感じ。

これで簡単なファイル存在の確認が可能だが、ディレクトリかどうかも判別したい場合はさらに以下のようにする。
S_ISDIR()を使うが、mode_t型を初期化する必要がある。

mode_t mod = st.st_mode;
if(S_ISIDR(mod)){
    //directoryならここが実行される
}else{
    //そうでなければここ
}

こうするとディレクトリかどうかの確認ができる。
これらの事を使って作ったのが上の関数。

これのWinAPI版も同様の関数名で書いて #ifdefで分岐させればファイルチェックが楽になると思う・・・
現在製作中... UNIX版は上に書いたとおり完成したので次はWinAPIでのファイル、ディレクトリチェックを試す。

Firefox ブラウザ無料ダウンロード