2
我想遍歷給定目錄中的所有文件,並返回它們的版本號和exe名稱。我試圖挖掘殼體,看看我是否可以解決這個問題,但是我一直無法找到解決方案。任何提示將不勝感激。使用delphi中的shell循環遍歷目錄中的文件
我想遍歷給定目錄中的所有文件,並返回它們的版本號和exe名稱。我試圖挖掘殼體,看看我是否可以解決這個問題,但是我一直無法找到解決方案。任何提示將不勝感激。使用delphi中的shell循環遍歷目錄中的文件
該做的:
刪除一個TMemo
和你的窗體上的TButton
做
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;
貌似缺少的youre'FindClose(SR);'循環之後。 – ain
@ain:非常真實。糾正。 –
對於D2010及以上版本,可以使用TDirectory.GetFiles中的s('C:\ Path \ To \ Files','* .exe)do // Stuff;'而不是'FindFirst' /'FindNext'/FindClose' – afrazier