17

パラメータ値 '*1.dat'を FindFirst に渡しますが、FindFirst() ルーチンが返す最初のファイルは46checks5.dat非常に一貫しています。

これは既知の問題ですか?

vpath:=trim(vpath);
result:=true;
try
  res:=findfirst(vpath+'\'+vmask,faarchive,search);    //vmask = *1.dat
  try 
    while res=0 do
    begin
      vlist.add(search.name);   //searchname returned is 46checks5.dat!!!
      res:=findnext(search);
    end;
  finally
    findclose(search);
  end;
except
  result:=false;
end;
4

2 に答える 2

25

その理由は、ファイルの名前が「長い」、つまり8文字を超えるためです。このようなファイルの場合、Windowsは「短い」名前も作成します。これは通常、フォームlongna~1.datで作成され、この短い名前は*1.datワイルドカードで検出されます。

空のディレクトリのコマンドプロンプトで同じ動作を簡単に再現できます。

C:\TEMP>echo。> 46checks5.dat
C:\ TEMP> dir / x * 1.dat
 ドライブCのボリュームにはラベルがありません。
 ボリュームシリアル番号は5C09-D9DEです

 C:\TEMPのディレクトリ

2011.04.15 21:37 3 46CHEC〜1.DAT 46checks5.dat
               1ファイル3バイト

のドキュメント。これは、状態FindFirstFile()の基盤となるAPIです。FindFirst

検索には、長いファイル名と短いファイル名が含まれます。

この問題を回避するには、Delphiのラッパーを使用するのではなくFindFirstFile()、Win32APIを呼び出しますFindFirstFileEx()FindExInfoBasicパラメータに渡しfInfoLevelIdます。

于 2011-04-15T18:46:37.987 に答える
0

他に何か問題があります。

フォルダーを作成しC:\Temp\Test、その中に 3 つのファイルを入れました。

TestFile1.txt
TestFile2.txt
TestFile3.txt

次にTMemo、新しいプロジェクトの新しい空白のフォームに をドロップし、このコードを「FormCreate」イベントに追加しました。

procedure TForm1.FormCreate(Sender: TObject);
var
  sPath: string;
  sFile: string;
  SR: TSearchRec;
begin
  sPath := 'C:\Temp\Test';
  sFile := '*1.txt';

  Memo1.Lines.Clear;
  if FindFirst(sPath + '\' + sFile, faArchive, SR) = 0 then
  begin
    try
      repeat
        Memo1.Lines.Add(SR.Name);
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
  end;
end;

フォームが表示されたとき、予想どおり、TMemo正確に 1 つのファイルが表示されました。TestFile1.txt

于 2011-04-15T16:50:59.200 に答える