J'ai un outil qui doit récupérer des fichiers depuis un serveur (sur un réseau interne).
J'utilisais CopyFileEx, mais cette fonction semble ne pas gérer plusieurs accès à un fichier (sur le serveur) en même temps.

On m'a conseillé d'utiliser InternetReadFile.
Ca semble fonctionner, mais la plupart des fichiers récupérés ont la même taille (1,75 ko); et c'est pas bon.

Voici comment je fais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
function TFormMaj.TelechargerFichier(const szFichierSource, szFichierDest: String; out szErreur: String): Boolean;
var
   szSource: String;
   nIndex, nTailleCopiee: Integer;
   hsession : HINTERNET;
   nTailleFichier, nTailleTransferee: Int64;
   hUrlFile: HINTERNET;
   F: File;
   Buffer: Array[1..1024] of Byte;
   nTailleLue: Cardinal;
begin
   Result := False;
 
   szSource := LowerCase(ExtractFilePath(szFichierSource));
   nIndex := Pos('\maj\', szSource);
   if nIndex > 0 then
   begin
      szSource := Copy(szSource, nIndex + 5, Length(szSource));
      szSource := StringReplace(szSource, '\', '/', [rfReplaceAll, rfIgnoreCase]);
 
      // Connexion.
      hSession := InternetOpen('serveurupdate', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
      try
         if Assigned(hSession) then
         begin
            Gauge.Progress := 0;      nTailleTransferee := 0;      nTailleFichier := GetTailleFichier(szFichierSource);
 
            // Ouverture du fichier.
            hUrlFile := InternetOpenURL(hSession, PChar(_szURL + szSource + ExtractFileName(szFichierSource)), nil, 0, 0, 0);
            if Assigned(hUrlFile) then
            begin
               try
                  try
                     // Téléchargement du fichier.
                     AssignFile(F, szFichierDest);
                     try
                        {$I-}
                        Rewrite(F, 1);
                        {$I+}
                        if IOResult = 0 then
                        begin
                           repeat
                              // Copie du bloc.
                              if InternetReadFile(hUrlFile, @Buffer, SizeOf(Buffer), nTailleLue) then
                              begin
                                 BlockWrite(F, Buffer, nTailleLue, nTailleCopiee);
                                 ...
                              end;
                           until(nTailleLue = 0) or (nTailleCopiee <> Integer(nTailleLue));
                        end;
                     finally
                        CloseFile(F);
                     end;
                  except
                     on E: Exception do
                     begin
                        szErreur := 'Échec téléchargement (InternetReadFile):  ' + E.Message;
                        Exit;
                     end;
                  end;
 
                  Result := True;
               finally
                  InternetCloseHandle(hUrlFile);
               end;
            end;
         end
         else
            szErreur := 'Échec connexion (InternetOpen):  ' + SysErrorMessage(GetLastError);
      finally
         InternetCloseHandle(hSession);
      end;
   end
   else
      szErreur := 'Erreur :  chemin [' + szFichierSource + '] incorrect !';
end;
J'ai fait une recherche sur le forum, mais les fonctions trouvées ressembles fortement à la mienne.
Qu'est ce que j'ai raté ?