Loop over files in a directory using the shell in delphi Loop over files in a directory using the shell in delphi shell shell

Loop over files in a directory using the shell in delphi


This does it:

Drop a TMemo and a TButton on your form and do

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