私の質問を説明する方法が正確にわかりません。これが私の説明の試みです: 関数 FindNext(SearchRec) は、ディレクトリから次のファイルを取得します。私のアプリケーションでは、現在の SearchRec インデックスからいくつかのファイルをさかのぼって探しています。では、どうすればそれを行うことができますか?
だから私は FindNext(SearchRec) の反対を探しています FindBackward(SearchRec) のような関数
私の質問を説明する方法が正確にわかりません。これが私の説明の試みです: 関数 FindNext(SearchRec) は、ディレクトリから次のファイルを取得します。私のアプリケーションでは、現在の SearchRec インデックスからいくつかのファイルをさかのぼって探しています。では、どうすればそれを行うことができますか?
だから私は FindNext(SearchRec) の反対を探しています FindBackward(SearchRec) のような関数
そのような機能はありません。たとえば、リスト内の以前のヒットを追跡し、そのリストを使用してバック トラッキングを行う必要があります。
それらをTSearchRecの配列に配置することをお勧めします
SearchRecArr:array of TSearchRec;
次に、特定のファイルに到達したら、必要なSearchRecを配列から取得します。
たとえば、これは、名前(z、z1、およびz2)の3つのテキストファイルをいくつかのフォルダーに配置した例です。次に、「z2.txt」に到達した場合、SearchRecを2ステップ逆に読みます。
procedure TForm2.Button1Click(Sender: TObject);
var
SearchRec:TSearchRec;
SearchRecArr:array of TSearchRec;
i:integer;
begin
i:=-1;
if FindFirst('C:\Users\zeina.shehab\Desktop\New folder\z*.txt',faAnyFile,SearchRec)=0 then
begin
repeat
SetLength(SearchRecArr,length(SearchRecArr)+1);
SearchRecArr[high(SearchRecArr)]:=SearchRec;
inc(i);
if SearchRec.Name='z2.txt' then
caption:=SearchRecArr[i-2].Name;
until (FindNext(SearchRec)<>0);
end;
end;
私は自分の関数を書きました。これは私にとって非常にうまく機能するコードであり、何千ものファイルに対して非常に効率的です(再生アルゴリズムが遅くならないため)。
Procedure GetBackward(var SRInitial:TSearchRec; iForwardSpeed:integer);
var SR:TSearchRec;
iIndex:integer;
vLastFiles:Array of String;
begin
SetLength(vLastFiles,Trunc(iForwardSpeed));
FindFirst(sPath+'*.txt',faAnyFile,SR);
while (FindNext(SR) = 0)and(SR.Name <> SRInitial.Name) do
begin
for iIndex := 0 to high(vLastFiles)-1 do
vLastFiles[iIndex]:=vLast[iIndex+1];
vLastFiles[high(vLastFiles)]:=SR.Name;
end;
//Fewer than ForwardSpeed
if vLastFiles[0] = '' then
begin
Exit;
end;
FindClose(SR);
FindClose(SRInitial);
FindFirst(sPath+'*.'+cbType.Text,faAnyFile,SRInitial);
while (FindNext(SRInitial) = 0)and(SRInitial.Name <> vLastFiles[0]) do
;
end;
機能が変更されました。