findfirstのエラーについて教えて頂きたいのですが

[戻る]
よっさん [E-Mail] 2002/07/25(木) 19:59:25
findfirst関数を使用して、指定したファイル情報を
取得する際に、errnoにEINVALが戻り値としてリターンされる
というのは、どのようなケースが考えられるのでしょうか。

ヘルプの説明では、"ファイル名が無効"と書かれていましたが
どのようなファイル名ならば無効というのが、色々とファイル名
で試してみましたが分かりません。

申し訳ありませんが、どなたか分かる方がいらっしゃいましたら
ご教授お願い致します。

よっさん [E-Mail] 2002/07/25(木) 20:49:39
すみません、大事な事を書くのを忘れていました。
開発環境は、OS    :  WINDOWS2000 
      開発ツール:  VC++6.0
です。

ループで、findfirst関数を使用しているのですが、
一回目は正常にファイル情報を取得して、正常値を
返してきます。
2回目のfindfirstで、エラー値を返してerrnoには
EINVALを返してきます。

wood 2002/07/25(木) 20:58:20
デバッガでは渡しているターゲットの値正常ですか
もしかしてNULLポインタがわたっていたり
ターゲットファイル名の先頭にNULLバイトが入ったりしていませんか

よっさん [E-Mail] 2002/07/25(木) 21:03:35
woodさん返信有難うございます。

渡している値としては、NULLは渡っていないと思います。
このエラーとして、どうも再現が出来ないみたいで
いつこの現象になるかが不定の為、困っています。

念の為、もう一度引数を調べてみたいと思います。

よっさん [E-Mail] 2002/07/25(木) 21:34:44
引数としては、問題ないみたいです。

処理概要としては、

■任意のタイミングで対象ディレクトリに複数作成される
 ファイルをfindfirst関数で、タイムスタンプの古い順
 に検索します。

■そして、検索してHITしたファイルを削除します。

■上記の処理の繰り返しです。

■終了を意味するファイルが、対象ディレクトリに作成されて
 そのファイルが取得された場合に処理を終了させます。


このような処理を行っている際に、不定期に
起こってしまいます。

wood 2002/07/25(木) 21:58:35
検索順序指定できましたっけ?
CFileFindはなぜ使わなかったのですか
参考までにお聞かせください 
MFC、SDK、コンソール、ウィンドウどんなタイプのアプリですか

sara 2002/07/26(金) 08:34:08
> ■任意のタイミングで対象ディレクトリに複数作成される
> ファイルをfindfirst関数で、タイムスタンプの古い順
> に検索します。

  どのような検索の仕方をしているのでしょうか?

 また、_findfirst()を複数コールする処理のようですが、この処理の中で_findclose()をど
のようなタイミングでコールしていますか?

よっさん [E-Mail] 2002/07/26(金) 10:30:43
woodさん、saraさん返信有難うございます。

プログラムは、WIN32コンソールアプリケーションで作成しています。

検索の仕方ですが、

□グローバル変数でタイムスタンプ保持用の
 変数を用意しておきます。

□該当ファイルがなくなるまでループを行います。

 ■findfirstで、ファイル検索をしてグローバル変数とのタイム
 スタンプを比較し、新しいファイルを取得します。

 ■findnextで、グローバル変数よりも新しく前回(findfirst or findnext)
  取得したファイルのタイムスタンプよりも古いファイルの検索
  をループで処理します。

 ■全てのファイルの検索が終了した時点で、ループを終了します。
  この時に、グローバル変数の次に新しいタイムスタンプの
  ファイルが検索できます。

 ■検索結果のタイムスタンプを、グローバル変数に格納します。

□ループ終端

以上のような、処理をしています。

_findcloseしている所は、_findfirst関数でエラー値が戻ってきた
場合と、_findnext関数でエラー値が戻ってきた時です。

先程、ネットで調べていたのですが_findfirst関数でエラーした場合
に、_findcloseするとCPUが暴走するというようなことが書かれて
いたのですが、本当なのでしょうか。
テストしているときには起こらなかったので、無いような気はして
いるのですが。

恥かしながら、CFileFind関数の存在を知らなかったです。
まだまだ、C言語勉強中のため_findfirstを見つけた時点で
これを使おうと思ったからです。

CFindFile関数も、検索する関数ですがMFCの関数ですよね。
使用することは可能なのですか?
初心者的な質問ですみませんが、宜しくお願い致します。。

wood 2002/07/26(金) 12:37:47
-----------------------------------
#include <afx.h>

void main(void)
{
  CFileFind cf;
}
-----------------------------------
これは 少なくとも VC++5.0ではとおります

プロジェクト設定[一般]の共有DLL でMFCを使用にしたら
出来ますけど
10KB のEXEで出来ました

CWNDなど渡す必要が無ければ使用可能と思っていましたが
間違っていたら 誰か指摘してください

sara 2002/07/26(金) 12:43:19
> プログラムは、WIN32コンソールアプリケーションで作成しています。
 これは最初の質問の時点で明記するべきことです。その他、OSや開発環境についても明記しま
しょう。(使用上の注意を熟読のこと)

> _findcloseしている所は、_findfirst関数でエラー値が戻ってきた
> 場合と、_findnext関数でエラー値が戻ってきた時です。
 _findfirst関数でエラー値が戻ってきた場合は、検索ハンドルが取得できていないので、
_flndclose()はできません。CPUが暴走するかどうかはともかく、コールしない方が良いでしょ
う。

> CFindFile関数も、検索する関数ですがMFCの関数ですよね。
> 使用することは可能なのですか?
 VC++を使用しているなら、プロジェクトを新規作成する際に、”MFCをサポートするアプリケ
ーション”を選択すると、コンソールアプリでもMFCを使用できます。
 しかし、C言語を勉強中ならMFCを使用する必要性は特にないでしょう。

 検索方法の基本方針は特に問題はなさそうですね。
 ということは、やはりファイル検索関数に渡す引数をどのようにセットしているかが問題で
す。
 対象ディレクトリをカレントディレクトリに設定して検索しているのでしょうか?
 それとも、絶対パス付きの文字列を渡しているのでしょうか。その場合、その文字列はどのよ
うにつくっているのでしょうか?

よっさん [E-Mail] 2002/07/26(金) 13:56:10
woodさん、saraさん返信有難うございます。

今後、開発環境などの前提条件を最初に
明記しようと思います。
ご迷惑をおかけいたしました。

MFCの使用方法が分かりました。
どうも有り難うございました。
今、作成しているものが終わったらMFCも
やってみようと思います。

_findfirst関数に渡している引数は、
絶対パス付きで、ファイル名はワイルドカード指定です。

更に、引数を中心にデバッグしてみたいと思います。

よっさん [E-Mail] 2002/07/29(月) 12:40:50
[[解決]]
どうもfindfirstを使用している関数を呼び出す側の方で、
引数の値をどこかのタイミングで壊しているような
気がします。
その部分を追求してみたいと思います。
多分、それで解決すると思います。

質問に答えてくださった方々、有難うございました。

古いスレッドには追加発言できません。