ファイルの検索エラーについて – 固定ページ 2 – プログラミング – Home

ファイルの検索エラーについて
 
通知
すべてクリア

ファイルの検索エラーについて

固定ページ 2 / 2

?
 ?
(@?)
ゲスト
結合: 23年前
投稿: 49
 

いやいや うちの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


返信引用
よっさん
 よっさん
(@よっさん)
ゲスト
結合: 23年前
投稿: 14
Topic starter  

?さん返信有難うございます。

すみません、私が間違えてremove()を処理の中に
入れてしまいました。(×_×;)
それなので、削除は呼び出し元で行っています。

参考サンプル有難うございます。
形式的には、修正していただいたサンプルで
いいと思いますよね。

何ででしょうかね~?
もう少し調べてみようと思います。


返信引用
よっさん
 よっさん
(@よっさん)
ゲスト
結合: 23年前
投稿: 14
Topic starter  

まだ、エラーの良い対処法が見つかりません。

※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

どなたか、ご理解している方がいらっしゃいましたら
ご教授宜しくお願い致します。


返信引用
高1
 高1
(@高1)
ゲスト
結合: 23年前
投稿: 14
 

この現象と似たような状況に陥ったことがあります。
予想では、ファイルが完全に削除される前に_findfirst()
することで、同じファイルが二度引っかかっているために
このエラーが起こるようです。

sleep(1000)を挿入することによってエラーが起きないのは、
1秒以内で削除できるファイルだからだと思われます。
大きなファイルを削除しようとするときっとエラーが起きる
と思いますよ。


返信引用
よっさん
 よっさん
(@よっさん)
ゲスト
結合: 23年前
投稿: 14
Topic starter  

高1さん、返信有難うございます。

やはり、ファイルが削除される前に
_findfirst()されてしまっている
と言うことですか。

しかし、私が作成してるプログラム
では、特にスレッドで処理しては
いないので、_findfirst()内部で
スレッド処理を行っているという
ことなのでしょうか?

高1さんは、似たような状況の際に
どのようなと対応をとられたの
でしょうか?
よろしければ、教えて頂けないで
しょうか。


返信引用
高1
 高1
(@高1)
ゲスト
結合: 23年前
投稿: 14
 

だいぶ前のことなので記憶があやふやなんですが、
ファイル情報からファイルにアクセスされているかを
調べたと思います。
たしかそんな関数があったような・・・

API関数の FindFirstFile を利用すると Close を考えなくても
良いので簡単だと思いますよ。


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 14
 

ちょっと突っ込み
>API関数の FindFirstFile を利用すると Close を考えなくても
>良いので簡単だと思いますよ。
FindCloseが必要だと思われますが・・


返信引用
よっさん
 よっさん
(@よっさん)
ゲスト
結合: 23年前
投稿: 14
Topic starter  

高1さん、返信有難うございます。

ファイルへのアクセスが開放された時点で、
FindFirst()を行うということですよね。

FindNextFile()の場合は、findclose()処理は
必要ですよね?
そういうわけではなくですか?

削除処理が完全に終了したら、findfirst()を
行うようにしてみようと思います。


返信引用
よっさん
 よっさん
(@よっさん)
ゲスト
結合: 23年前
投稿: 14
Topic starter  

少々話がずれるのですが、_findfirst()を使用して、
ワイルドカード指定で、
ABCD??????????E.??????
というような指定を行って検索したとします。
すると、
ABCD1234E.123
というファイルも取ってきてしまいました。

結局、指定した文字の間(ABCDとEとの間)や
ファイル名の指定が?で終わっている指定は
(.??????等)全く無意味なのでしょうか。

実際、使用する際はファイル名が固定長であり
ファイル名のフォーマットがほぼ決まっている
場合にしか使えないということなのでしょうか。

上記の例の時は、ファイルを取得してきて欲しく
ないのですが、他にいい方法はないでしょうか。

どなたか、ご教授お願い致します。


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました