Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi ftp download cannot find file ??? (https://www.delphipraxis.net/54306-ftp-download-cannot-find-file.html)

Blumi 1. Okt 2005 12:35


ftp download cannot find file ???
 
Hallo zusammen, habe nochmals eine Frage, die aber etwas komisch ist, nuja.

Ich habe immer noch folgenden Code für den Download:

Delphi-Quellcode:
{
  The following function shows how to connect to a ftp server
  and download a file.
  It uses the functions from wininet.dll.

  You need a ProgressBar to show the progress and a Label to show progress informations.
}

uses
  WinInet, ComCtrls;

function FtpDownloadFile(strHost, strUser, strPwd: string;
  Port: Integer; ftpDir, ftpFile, TargetFile: string; ProgressBar: TProgressBar): Boolean;

  function FmtFileSize(Size: Integer): string;
  begin
    if Size >= $F4240 then
      Result := Format('%.2f', [Size / $F4240]) + ' Mb'
    else
    if Size < 1000 then
      Result := IntToStr(Size) + ' bytes'
    else
      Result := Format('%.2f', [Size / 1000]) + ' Kb';
  end;

const
  READ_BUFFERSIZE = 4096; // or 256, 512, ...
var
  hNet, hFTP, hFile: HINTERNET;
  buffer: array[0..READ_BUFFERSIZE - 1] of Char;
  bufsize, dwBytesRead, fileSize: DWORD;
  sRec: TWin32FindData;
  strStatus: string;
  LocalFile: file;
  bSuccess: Boolean;
begin
  Result := False;

  { Open an internet session }
  hNet := InternetOpen('Program_Name', // Agent
                        INTERNET_OPEN_TYPE_PRECONFIG, // AccessType
                        nil, // ProxyName
                        nil, // ProxyBypass
                        0); // or INTERNET_FLAG_ASYNC / INTERNET_FLAG_OFFLINE

  {
    Agent contains the name of the application or
    entity calling the Internet functions
  }


  { See if connection handle is valid }
  if hNet = nil then
  begin
    ShowMessage('Unable to get access to WinInet.Dll');
    Exit;
  end;

  { Connect to the FTP Server }
  hFTP := InternetConnect(hNet, // Handle from InternetOpen
                          PChar(strHost), // FTP server
                          port, // (INTERNET_DEFAULT_FTP_PORT),
                          PChar(StrUser), // username
                          PChar(strPwd), // password
                          INTERNET_SERVICE_FTP, // FTP, HTTP, or Gopher?
                          0, // flag: 0 or INTERNET_FLAG_PASSIVE
                          0);// User defined number for callback

  if hFTP = nil then
  begin
    InternetCloseHandle(hNet);
    ShowMessage(Format('Host "%s" is not available',[strHost]));
    Exit;
  end;

  { Change directory }
  bSuccess := FtpSetCurrentDirectory(hFTP, PChar(ftpDir));

  if not bSuccess then
  begin
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hNet);
    ShowMessage(Format('Cannot set directory to %s.',[ftpDir]));
    Exit;
  end;

  { Read size of file }
  if FtpFindFirstFile(hFTP, PChar(ftpFile), sRec, 0, 0) <> nil then
  begin
    fileSize := sRec.nFileSizeLow;
    // fileLastWritetime := sRec.lastWriteTime
  end else
  begin
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hNet);
    ShowMessage(Format('Cannot find file ',[ftpFile]));
    Exit;
  end;

  { Open the file }
  hFile := FtpOpenFile(hFTP, // Handle to the ftp session
                       PChar(ftpFile), // filename
                       GENERIC_READ, // dwAccess
                       FTP_TRANSFER_TYPE_BINARY, // dwFlags
                       0); // This is the context used for callbacks.

  if hFile = nil then
  begin
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hNet);
    Exit;
  end;

  { Create a new local file }
  AssignFile(LocalFile, TargetFile);
  {$i-}
  Rewrite(LocalFile, 1);
  {$i+}

  if IOResult <> 0 then
  begin
    InternetCloseHandle(hFile);
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hNet);
    Exit;
  end;

  dwBytesRead := 0;
  bufsize := READ_BUFFERSIZE;

  while (bufsize > 0) do
  begin
    Application.ProcessMessages;

    if not InternetReadFile(hFile,
                            @buffer, // address of a buffer that receives the data
                            READ_BUFFERSIZE, // number of bytes to read from the file
                            bufsize) then Break; // receives the actual number of bytes read

    if (bufsize > 0) and (bufsize <= READ_BUFFERSIZE) then
      BlockWrite(LocalFile, buffer, bufsize);
    dwBytesRead := dwBytesRead + bufsize;

    { Show Progress }
    ProgressBar.Position := Round(dwBytesRead * 100 / fileSize);
    Form1.Label1.Caption := Format('%s of %s / %d %%',[FmtFileSize(dwBytesRead),FmtFileSize(fileSize) ,ProgressBar.Position]);
  end;

  CloseFile(LocalFile);

  InternetCloseHandle(hFile);
  InternetCloseHandle(hFTP);
  InternetCloseHandle(hNet);
  Result := True;
end;
Jetzt gibt es aber bei manchen Servern Problemen, keine Ahnung??
Wenn ich den Pfad einer Datei in eine Liste lade zeigt es mir eine Datei an 'examples.pdf '. Wenn ich aber die Datei mit der vorherigen Funktion laden möchte kommt folgende Meldung:

Cannot find File

Das verstehe ich eigentlich nicht, wenn sie icht vorhanden wäre würde sie doch auch nicht in der Liste anzeigen? Oder was mach ich falsch??

Vielen Dank im Vorraus, Gruss Blumi

marabu 1. Okt 2005 15:43

Re: ftp download cannot find file ???
 
Hi,

die Funktion FtpFindFirstFile() will einen fullname:

Delphi-Quellcode:
...
var
  ftpFullName: string;
...
  if (ftpDir = '') or (ftpDir[Length(ftpDir)] <> '/') then
    ftpDir := ftpDir + '/';
  ftpFullName := ftpDir + ftpFile;

  if FTPFindFirstFile(hFTP, PChar(ftpFullName), sRec, 0, 0) <> nil then
...
Grüße vom marabu

Blumi 1. Okt 2005 18:43

Re: ftp download cannot find file ???
 
Sry, leider hat es diesmal nicht so richtig funktioniert, besser gesagt es geht gar nichts mehr :(

Also wenn ich dort nciht ftpFile sondern ftpFullName stehen habe, dann aldet es nciht einmal eine Datei die mit ftpFullName funktioniert !

Ich habe es so eingebaut:

Delphi-Quellcode:

var
  ftpFullName: string;
...


  if (ftpDir = '') or (ftpDir[Length(ftpDir)] <> '/') then
    ftpDir := ftpDir + '/';
  ftpFullName := ftpDir + ftpFile;

  { Read size of file }
  if FtpFindFirstFile(hFTP, PChar(ftpFullName), sRec, 0, 0) <> nil then
  begin
    fileSize := sRec.nFileSizeLow;
    // fileLastWritetime := sRec.lastWriteTime
  end else
  begin
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hNet);

...

Blumi

marabu 1. Okt 2005 19:00

Re: ftp download cannot find file ???
 
Hallo Blumi,

ich hatte den Code vorher mit meinem Filezilla Server getestet. Funktioniert der Code bei dir denn gar nicht oder nur in Verbindung mit bestimmten Servern?

marabu

Blumi 1. Okt 2005 19:44

Re: ftp download cannot find file ???
 
Hi

Also ich habe es auch mit Servern probiert die vorher funktionierten, und jetzt geht gar nichts mehr, es kommt immer die Fehlermeldung File Not Found

marabu 2. Okt 2005 09:53

Re: ftp download cannot find file ???
 
Hallo Blumi,

kannst du mir einen public ftp server nennen, bei dem mein Code versagt? Ich könnte das dann näher untersuchen.

marabu

Blumi 2. Okt 2005 14:18

Re: ftp download cannot find file ???
 
Hi

Nach mehrmailigem Ausprobieren habe ich es jetzt herausgefunden, wann es nicht geht. Uns zwar wenn der Dateiname ein Abstand enthält, Beispiel: "1 Zeichnen ... .pdf" !!

Würd mich freuen wenn du es heruasbekommen könntest, wie ich das fertig bringe, habe dir den FTP geschickt,


Gruss

marabu 2. Okt 2005 15:06

Re: ftp download cannot find file ???
 
Dann hat sich ja alles aufgeklärt - Leerstellen im Namen gestattet die von dir verwendete Funktion nicht:

Zitat:

Zitat von PSDK
lpszSearchFile
[in] Pointer to a null-terminated string that specifies a valid directory path or file name for the FTP server's file system. The string can contain wildcards, but no blank spaces are allowed. If the value of lpszSearchFile is NULL or if it is an empty string, the function finds the first file in the current directory on the server.

Für solche Namen wirst du einen wildcard character einsetzen und dann über die gefundenen Dateien iterieren müssen, um im direkten Vergleich dann die richtige Datei zu identifizieren.

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz