2011-08-04 9 views
2

特定のディレクトリ内のすべてのファイルをループし、そのバージョン番号とexe名を返したいとします。私はこれを取り除くことができるかどうかを調べるためにシェルに掘り下げてみましたが、解決策を見つけることができませんでした。任意のヒントをいただければ幸いです。デルファイのシェルを使用してディレクトリ内のファイルをループする

答えて

12

これはそれをしない:

ドロップフォーム上TMemoTButton

type 
    TVerInfo = packed record 
    vMajor, vMinor, vRelease, vBuild: word; 
    end; 

function GetFileVerNumbers(const FileName: string): TVerInfo; 
var 
    len, dummy: cardinal; 
    verdata: pointer; 
    verstruct: pointer; 
const 
    InvalidVersion: TVerInfo = (vMajor: 0; vMinor: 0; vRelease: 0; vBuild: 0); 
begin 
    len := GetFileVersionInfoSize(PWideChar(FileName), dummy); 
    if len = 0 then 
    Exit(InvalidVersion); 
    GetMem(verdata, len); 
    try 
    GetFileVersionInfo(PWideChar(FileName), 0, len, verdata); 
    VerQueryValue(verdata, '\', verstruct, dummy); 
    result.vMajor := HiWord(TVSFixedFileInfo(verstruct^).dwFileVersionMS); 
    result.vMinor := LoWord(TVSFixedFileInfo(verstruct^).dwFileVersionMS); 
    result.vRelease := HiWord(TVSFixedFileInfo(verstruct^).dwFileVersionLS); 
    result.vBuild := LoWord(TVSFixedFileInfo(verstruct^).dwFileVersionLS); 
    finally 
    FreeMem(verdata); 
    end; 
end; 

function GetFileVer(const FileName: string): string; 
begin 
    with GetFileVerNumbers(FileName) do 
    result := IntToStr(vMajor) + '.' + 
     IntToStr(vMinor) + '.' + IntToStr(vRelease) + '.' + 
     IntToStr(vBuild); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
const 
    path = 'C:\WINDOWS'; 
var 
    SR: TSearchRec; 
begin 
    Memo1.Clear; 
    if FindFirst(IncludeTrailingBackslash(path) + '*.exe', faAnyFile, SR) = 0 then 
    try 
     repeat 
     Memo1.Lines.Add(SR.Name + #9 + 
      GetFileVer(IncludeTrailingBackslash(path) + SR.Name)); 
     until FindNext(SR) <> 0; 
    finally 
     FindClose(SR); 
    end; 
end; 

Screenshot http://privat.rejbrand.se/verinfo.png

+1

を行うには、 'FindClose(SR)を欠落しているyoureのように見えます;'ループの後に。 – ain

+0

@ain:非常に真実。修正されました。 –

+3

D2010以降では、 'FindFirst' /' FindNext'/''の代わりにTDirectory.GetFiles( 'C:\ Path \ To \ Files'、 '* .exe)do // Stuff; 'の' for s' FindClose' – afrazier

関連する問題