いやいや うちのMSDNには以下のように・・・
hFind = FindFirstFile(argv[1], &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) {
printf (Invalid File Handle. Get Last Error reports %d\n, GetLastError
());
} else {
printf (The first file found is %s\n, FindFileData.cFileName);
FindClose(hFind);
}
なんで hlFile != INVALID_HANDLE_VALUE の時。
で、なぜ一緒にFindNextFileの用例も載せておかないのかMS。
多分こんな感じ
hFind = FindFirstFile(*.*, &finddata);
if ( hFind == INVALID_HANDLE_VALUE ) return; // ここでチェック
iRet = FindNextFile(hFind, &finddata);
while( iRet ){ // FindNextFileの時は0以外ならOK
remove(取得ファイルパス); // あれ?前は呼び出し元で消してたんじゃあ?
// woodさんの 2002/08/20(火) 20:40:14 が気になる
// CFile::Remove(取得ファイルパス); のほうが好き
iRet = FindNextFile(hFind, &finddata);
}
FindClose(hFind);
といいつつ自分でやってないので・・・どなたかよろしくm(__)m
?さん返信有難うございます。
すみません、私が間違えてremove()を処理の中に
入れてしまいました。(×_×;)
それなので、削除は呼び出し元で行っています。
参考サンプル有難うございます。
形式的には、修正していただいたサンプルで
いいと思いますよね。
何ででしょうかね~?
もう少し調べてみようと思います。
まだ、エラーの良い対処法が見つかりません。
※1 対象にしている検索パスは、毎回同じ
ディレクトリを指しています。
※2 ディレクトリ内に、初めから検索対象ファイルが
存在していた場合にのみ、エラーが発生します。
■_findfirst()、_findnext()を使用して
ファイル1件取得する。
■取得したファイルを、remove()を使用して
削除を行う。(findclose()の後にしています。)
■以上の処理を繰り返す。
という形でしていると、1件取得して削除した後
次のファイル検索をする為に_finfdfirst()を
起動すると、エラーコードの
「ERROR_SHARING_VIOLATION」を返してきます。
「ERROR_SHARING_VIOLATION」は、「他のプロセスが
ファイルを使用している為、プロセスはそのファイルに
アクセスすることが出来ません。」というエラーです。
特に、検索対象ディレクトリのファイルにアクセス
しているようなことはしていません。
応急措置としては、エラーが返って来たとしても
検索処理を継続すれば全ての検索対象ファイルを
取得することが出来ます。
もうひとつ、remove()で削除した後にsleep(1000)を
挿入して見たところ、今まで起きていたエラーが、
再現しなくなりました。(今のところはですけれど)
ファイル削除を行って、すぐに_findfirst()をかけると
エラーを返してしまうのでしょうか?
それと、_findfirst()が「ERROR_SHARING_VIOLATION」
を返す時は、どのような状況下なのでしょうか?
長々と、書いてしまって申し訳ありません。m(__)m
どなたか、ご理解している方がいらっしゃいましたら
ご教授宜しくお願い致します。
この現象と似たような状況に陥ったことがあります。
予想では、ファイルが完全に削除される前に_findfirst()
することで、同じファイルが二度引っかかっているために
このエラーが起こるようです。
sleep(1000)を挿入することによってエラーが起きないのは、
1秒以内で削除できるファイルだからだと思われます。
大きなファイルを削除しようとするときっとエラーが起きる
と思いますよ。
高1さん、返信有難うございます。
やはり、ファイルが削除される前に
_findfirst()されてしまっている
と言うことですか。
しかし、私が作成してるプログラム
では、特にスレッドで処理しては
いないので、_findfirst()内部で
スレッド処理を行っているという
ことなのでしょうか?
高1さんは、似たような状況の際に
どのようなと対応をとられたの
でしょうか?
よろしければ、教えて頂けないで
しょうか。
だいぶ前のことなので記憶があやふやなんですが、
ファイル情報からファイルにアクセスされているかを
調べたと思います。
たしかそんな関数があったような・・・
API関数の FindFirstFile を利用すると Close を考えなくても
良いので簡単だと思いますよ。
ちょっと突っ込み
>API関数の FindFirstFile を利用すると Close を考えなくても
>良いので簡単だと思いますよ。
FindCloseが必要だと思われますが・・
高1さん、返信有難うございます。
ファイルへのアクセスが開放された時点で、
FindFirst()を行うということですよね。
FindNextFile()の場合は、findclose()処理は
必要ですよね?
そういうわけではなくですか?
削除処理が完全に終了したら、findfirst()を
行うようにしてみようと思います。
少々話がずれるのですが、_findfirst()を使用して、
ワイルドカード指定で、
ABCD??????????E.??????
というような指定を行って検索したとします。
すると、
ABCD1234E.123
というファイルも取ってきてしまいました。
結局、指定した文字の間(ABCDとEとの間)や
ファイル名の指定が?で終わっている指定は
(.??????等)全く無意味なのでしょうか。
実際、使用する際はファイル名が固定長であり
ファイル名のフォーマットがほぼ決まっている
場合にしか使えないということなのでしょうか。
上記の例の時は、ファイルを取得してきて欲しく
ないのですが、他にいい方法はないでしょうか。
どなたか、ご教授お願い致します。