2012-10-02 3 views
1

Je veux pointer vers un http://somesite.com/somefile.exe et vérifier la version du fichier côté serveur exe et comparer les informations de version au même fichier .exe tout prêt sur mon ordinateur. Si le fichier côté serveur est plus récent, je veux le télécharger.Vérifiez la version du fichier et du fichier .exe (côté serveur) et, si plus récent, téléchargez

J'ai des fonctions pour télécharger le fichier et vérifier la version du fichier mais je veux vérifier si la version du fichier est plus récente que celle que j'ai sur mon ordinateur.

Je ne veux pas télécharger l'exe sur mon ordinateur, puis vérifier la version du fichier.

Est-ce que quelqu'un ici a été capable de faire cela?

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

Cela ne peut pas être fait! Vous ne pouvez pas introspecter un fichier sans le télécharger! – LaKraven

+1

Vous devriez vérifier par la date de modification du fichier EXE sur le serveur à la place; en utilisant la méthode de requête HTTP HEAD. Sinon, vous devriez avoir quelque chose comme un fichier XML sur le serveur qui décrivent les informations du fichier EXE actuellement disponibles. – Jay

+0

Lors du téléchargement de l'application - téléchargez également le fichier PAD: http://pad.asp-software.org/ - vérifiez ensuite par ce fichier. Ou vous pouvez même faire du fil RSS pour votre application. –

Répondre

6

Vous ne pouvez pas vérifier la FileVersion du fichier sans avoir physiquement à inspecter, ce qui signifie que vous devez être en mesure d'avoir tous les octets disponibles, et les fonctions de l'API version du fichier s'attendre à un fichier de disque physique. (IOW, vous ne pouvez pas faire cela sans télécharger le fichier sur votre disque local d'abord.)

De plus, vous le téléchargez déjà en mémoire avec le HTTP GET de toute façon, donc vous n'économisez rien dans la bande passante en premier lieu.

L'alternative (si c'est une option) est d'avoir un fichier sur le serveur qui contient le numéro de version que le fichier local peut télécharger et lire à la place. Si vous ne pouvez pas faire cela, vous n'avez probablement pas de chance et vous devrez faire le téléchargement complet.

+0

Vous pouvez également ajouter la version au nom de fichier, bien que cela nécessite de renommer après le téléchargement si vous téléchargez l'exécutable réel au lieu de "juste" un programme d'installation contenant l'exécutable mis à jour. –

8

Vous ne pouvez pas accéder à la version du fichier à distance. Vous devez d'abord télécharger le fichier localement, ou vous devez stocker la version du fichier dans un fichier distinct que vous pouvez télécharger, ou vous devez écrire un script côté serveur auquel votre client peut envoyer une requête et lui demander d'accéder au script. version du fichier et le renvoyer à votre client.

Une meilleure option consiste à utiliser la fonctionnalité "GET conditionnel" intégrée de HTTP à la place (si le serveur le prend en charge). Votre client peut inclure un en-tête "If-Modified-Since" dans sa requête, puis le serveur ne livrera le fichier demandé que s'il a été modifié côté serveur après l'horodatage demandé. Sinon, un code de réponse 304 sera renvoyé indiquant que le client a déjà le dernier fichier. Lisez RFC 2616 Section 14.25 pour plus de détails.

Questions connexes