1

注:問題が解決したので、元の投稿にコメントを追加しました。

http://msdn.microsoft.com/en-us/library/6tkkkc1y%28v=vs.90%29.aspx」によると、次のように述べられています。

* _findfirst関数または_findnext関数(または任意のバリアント)の使用が終了したら、_findcloseを呼び出す必要があります。これにより、アプリケーションでこれらの関数によって使用されるリソースが解放されます。*

--コメント:あいまいですが、Microsoftが言おうとしているのは次のとおりです。一部のユーザーは最初のファイルを見つけて(_findnextを呼び出す必要はありません)、次に_findcloseを呼び出す必要があります。一部のユーザーは_findnextを呼び出し(既に_findfirstを呼び出している必要があります)、それを使用し終えたら、_findcloseを呼び出します。実際には、_ findnextは複数回呼び出すことができますが、_findcloseは、_findfirstによって作成されたハンドルに対してのみ責任があります。

以下は、ディレクトリ内のファイルを一覧表示するために広く使用されているコードです。-コメント:それは正しいです。

たとえば、ディレクトリに2つのファイルと1つのディレクトリがある場合、次のようになります。

.
..
ddd
file1.txt
file2.txt

_findfirstは1回呼び出されます。ハンドルの対応するfileinfoは、システムディレクトリ「。」です。(そうですか?) -コメント:いいえ。ハンドルはファイルとディレクトリのグループであり、fileinfoは「カーソル」として機能します。(fileinfoには常に「name」フィールドが含まれていました。_findnextの実装では「name」を使用して、ハンドルで指定されたファイルとディレクトリのグループで次のフィールドを検索しているに違いありません)

_findnextは4回呼び出されます。(最初の引数は常に「。」に対応するハンドルです、そうですか?) --comment: yes+no。最初の引数は常に同じハンドルです。ハンドルはどのfileinfoにも対応していませんが、それらのグループに対応しています。

私の質問は次のとおりです。

「_findclose」は1回だけで十分ですか? * --comment: *はい。

_findnextがハンドル値を変更しない場合、次のファイル(またはディレクトリ)の検索を開始する場所をどのように「記憶」できますか?(申し訳ありませんが、「リンクリスト」パターンで考えていたのかもしれません。) * --comment: *fileinfoの名前フィールドを使用しているに違いありません。Windowsエクスプローラーの場合と同様に、ファイル名を指定してフォルダー内のコンテンツを並べ替えると、リスト内での位置がわかるため、「次を検索」できます。

必要以上に_findcloseを呼び出すことによる害はありますか?(クラッシュなど) * --comment: *ばかげた質問。ごめん!

または、次のコードはまったく間違っていますか?はいの場合、それを実装する正しい方法は何ですか? -正しいコードです。

// List the files in the directory
intptr_t file;
_finddata_t filedata;
file = _findfirst(desc.c_str(),&filedata);
if (file != -1)
{
  do
  {
    cout << filedata.name << endl;
    // Or put the file name in a vector here
  } while (_findnext(file,&filedata) == 0);
}
else
{
  cout << "No described files found" << endl;
}
_findclose(file);

プロセスが生きている場合は削除できないディレクトリをアプリケーションがフリーズしているという問題が発生したため、これを尋ねました。ただし、「_findfirst」からのすべての戻り値で「_findclose」が呼び出されることは保証できます。「_findnext」を呼び出した後に「_findclose」を追加すると、問題は完全に修正されます。どうすればそれを説明するのを手伝ってくれますか?

-コメント:ごめんなさい。簡単に「保証」を使用しないでください。そこにバグがあります。

注:ファイルを開く、読み取り/書き込み/読み取り/書き込み...、ファイルハンドルを閉じるなど、ハンドルとは何かを理解するのに問題はありません。これらの3つのAPIを説明しているドキュメントがあいまいであることがわかりました。

-コメント:あなたの英語を上達させるために行きなさい。

前もって感謝します。

4

2 に答える 2

4

_findclose への呼び出しは、への呼び出しと一致する必要があります。_findfirstつまり、 を呼び出すたび_findfirstに、一致する への呼び出しが必要_findcloseです。

上記のコードでは、 への呼び出しが 1 つ_findfirstしかないため、 への呼び出しが 1 つだけであることは正しいこと_findcloseです。

サブディレクトリの再帰的検索を行っていた場合_findfirst、階層を下降するときに への複数の呼び出しが発生し、終了_findcloseして階層を上に戻ると への呼び出しが一致することになります。

于 2013-03-21T03:16:16.273 に答える
0

終了したら、_findcloseを1回呼び出すだけで済みます。

Windowsでは、ディレクトリがプロセスの現在のディレクトリである場合、ディレクトリがロックされることがあります。_chdirを呼び出してみてください。

それが機能しない場合...検索しているディレクトリ内のファイルを開いていますか?開いているファイルは、ディレクトリもロックする可能性があります。

ProcessExplorerにアプリを見てもらうと便利な場合があります。それはあなたが開いたままにしたハンドルを確実に教えてくれます。

于 2013-03-21T03:16:03.747 に答える