我想指向一个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;
答案 0 :(得分:8)
您无法远程访问文件版本。您需要先在本地下载文件,或者需要将文件版本存储在可以下载的单独文件中,或者需要编写服务器端脚本,客户端可以向其发送请求并让它访问文件版本并将其返回给您的客户。
更好的选择是使用HTTP的内置“条件GET”功能(如果服务器支持它)。您的客户端可以在其请求中包含“If-Modified-Since”标头,然后只有在请求的时间戳之后在服务器端修改了所请求的文件,服务器才会提供所请求的文件。否则,将发回304
回复代码,表明客户端已拥有最新文件。请阅读RFC 2616 Section 14.25了解详情。
答案 1 :(得分:6)
如果没有实际检查文件,则无法检查文件的FileVersion
,这意味着您必须能够拥有所有可用字节,并且文件版本API函数需要物理磁盘文件。 (如果没有先将文件下载到本地驱动器,则无法执行此操作。)
此外,您已经使用HTTP GET
完全将其下载到内存中,因此您首先不会在带宽中保存任何内容。
备选方案(如果它是一个选项)是在服务器上有一个文件,其中包含本地文件可以下载和读取的版本号。如果你不能这样做,你可能运气不好,必须完全下载。