1

我想指向http://somesite.com/somefile.exe并检查 exe 服务器端的文件版本,并将版本信息与我计算机上准备好的同一个 .exe 文件进行比较。如果服务器端文件较新,那么我想下载它。

我有下载文件和检查文件版本的功能,但我想检查文件版本是否比我电脑上的版本新。

我不想将 exe 下载到我的计算机,然后检查文件版本。

这里有人能够做到这一点吗?

function GetVersion(sFileName:string): string;
var
 VerInfoSize: DWORD;
 VerInfo: Pointer;
  VerValueSize: DWORD;
  VerValue: PVSFixedFileInfo;
 Dummy: DWORD;
begin
VerInfoSize := GetFileVersionInfoSize(PChar(sFileName), Dummy);
GetMem(VerInfo, VerInfoSize);
GetFileVersionInfo(PChar(sFileName), 0, VerInfoSize, VerInfo);
VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
 with VerValue^ do
begin
 Result := IntToStr(dwFileVersionMS shr 16);
 Result := Result + '.' + IntToStr(dwFileVersionMS and $FFFF);
 Result := Result + '.' + IntToStr(dwFileVersionLS shr 16);
 Result := Result + '.' + IntToStr(dwFileVersionLS and $FFFF);
end;
 FreeMem(VerInfo, VerInfoSize);
end;

procedure TForm1.Button1Click(Sender: TObject);
 var
 Http: TIdHTTP;
 MS: TMemoryStream;
begin
 Http := TIdHTTP.Create(nil);
  try
   MS := TMemoryStream.Create;
  try
   Http.OnWork:= HttpWork;

  Http.Get('http://live.sysinternals.com/ADExplorer.exe', MS);
  MS.SaveToFile('C:\ADExplorer.exe');

 finally
   MS.Free;
 end;
finally
Http.Free;
 end;

end;
4

2 回答 2

8

您无法远程访问文件版本。您需要先在本地下载文件,或者需要将文件版本存储在可以下载的单独文件中,或者您需要编写一个服务器端脚本,您的客户端可以向其发送请求并让它访问文件版本并将其返回给您的客户。

更好的选择是使用 HTTP 的内置“条件 GET”功能(如果服务器支持)。您的客户端可以在其请求中包含“If-Modified-Since”标头,然后服务器将仅在请求的时间戳之后在服务器端修改了请求的文件时才交付请求的文件。否则304将发回一个回复代码,指示客户端已经拥有最新文件。阅读RFC 2616 第 14.25 节了解更多详细信息。

于 2012-10-03T00:06:49.553 回答
6

如果没有FileVersion 实际检查文件,则无法检查文件,这意味着您必须能够拥有所有可用字节,并且文件版本 API 函数需要物理磁盘文件。(IOW,如果不先将文件下载到本地驱动器,则无法执行此操作。)

此外,无论如何,您已经使用 HTTP 将其完全下载到内存中GET,因此您一开始并没有节省任何带宽。

另一种方法(如果可以的话)是在服务器上保存一个文件,其中包含本地文件可以下载和读取的版本号。如果你不能这样做,你可能不走运,将不得不进行完整下载。

于 2012-10-02T23:27:04.663 回答