Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Prism idFTP.Get - Destination file already exists (https://www.delphipraxis.net/66975-idftp-get-destination-file-already-exists.html)

berens 7. Apr 2006 11:28


idFTP.Get - Destination file already exists
 
Zunächst mal vorweg: ganz blöd bin ich hoffentlich mal nicht.

Problem: Delphi.Net, Indy FTP-Client, Verbindung zum FTP-Server - wunderbar, FTP.Get --> Destination file already exists.
Die Datei existiert auf der Festplatte 100% nicht (!). Selbst wenn ich den FTP.Get Parameter Overwrite verwende kommt diese Meldung. Was tun?

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse IdFTP.EIdFTPFileAlreadyExists mit der Meldung 'Destination file already exists.' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

Der Zielordner hat alle Schreibrechte, die Datei existiert nicht und der Zieldateiname ist auch korrekt (keine doppelten \ oder so).

Code:
procedure TfrmMain.timStartTimer(Sender: TObject);
var
  f: TextFile;
  FileName: string;
  DestFileName: string;
  t: string;
begin
  timStart.Enabled := false;
  try
    log('Verbinde nach ' + IdFTP.Host);
    IdFTP.Connect;
    IdFTP.Login;
    if IdFTP.Connected then begin
      log('Verbindung erfolgreich hergestellt!');
      t := 'test';
      FileName := 'files.txt';
      DestFileName := GetRunDir + FileName; // GetRunDir = Aktueller Pfad mit allen Schreibrechten
      IdFTP.Get(FileName, DestFileName); // <-- Liefert Fehler
      if FileExists(FileName) then begin
        assignfile(f, FileName);
        reset(f);
        while not eof(f) do begin
          try
            readln(f, t);
            IdFTP.Get(t, GetRunDir + t, true, true);
          except
            log('Datei ' + t + ' konnte nicht heruntergeladen werden!');
          end;
        end;
      end else begin
        log('Die Datei files.txt wurde nicht gefunden!');
      end;
    end else begin
      log('Konnte mich nicht verbinden!');
    end;
  except
    on E: Exception do begin
      log('Es gab ein kritisches Problem: ' + E.Message);
    end;
  end;
end;

movietigger 10. Apr 2006 11:55

Re: idFTP.Get - Destination file already exists
 
Hallo!
Genau dieses Problem hatte ich gestern auch.
Nach meinem Umstieg auf Delphi 2006 Professional wollte ich ein bestehendes Programm erweitern, und das gar nicht mal bei der FTP-Funktion. Beim Testen bekam ich dann diese Fehlermeldung. Keine Ahnung warum. Es hatte sich am FTP-Server nichts geändert.
NAch längerem Suchen und Experimentieren habe ich folgendes mit Erfolg praktiziert:

IdFTP1.Get('quelle.txt.','ziel.txt',true)

Der dritte Parameter (also true) ist eigentlich der Schalter für den RESUME-Modus bei der FTP-Übertragung. Sobald er auf False steht oder einfach nicht definiert wird wie bei Dir funktioniert die Sache nicht...
Hab' bísher noch nicht festgestellt warum.. In den Vorgängerversionen mit Delphi 7 war es jedenfalls anders...

Bernhard Geyer 10. Apr 2006 12:00

Re: idFTP.Get - Destination file already exists
 
Zitat:

Zitat von movietigger
Hab' bísher noch nicht festgestellt warum.. In den Vorgängerversionen mit Delphi 7 war es jedenfalls anders...

Das Problem ist das die Indy-Komponenten für eine .NET-Kompatiblität sehr große Änderungen erfahren haben was sich oft negativ auf die SW-Qualität ausgewirkt hat. Evtl. mal die neueste Version installieren.

berens 10. Apr 2006 12:10

Re: idFTP.Get - Destination file already exists
 
Also ich weiss nicht. Ich habe es nun mit der neuesten Version von Indy indy_vs10.1.5.exe versucht, und dem Befehl

Delphi-Quellcode:
IdFTP.Get(FileName, GetRunDir + FileName, true, true);
Selbe Fehlermeldung...

Diese generelle Funktion für ein existierendes idFTP auf frmMain umgeht das Problem:

Delphi-Quellcode:
procedure TfrmMain.FTPGet(_File: WideString);
var
  fs: TFileStream;
  DestFileName: string;
begin
  if IdFTP.Connected then begin
    DestFileName := GetRunDir + _File;
    log('Quelle: ' + _File);
    log('Ziel: ' + DestFileName);
    if IdFTP.Size(_File) <> 0 then begin
      fs := TFileStream.Create(DestFileName, fmOpenReadWrite or fmShareDenyNone or fmCreate);
      try
        try
          IdFTP.Get(_File, fs, false);
        except
          on E: Exception do begin
            log(E.Message);
          end;
        end;
      finally
        FreeAndNil(fs);
      end;
    end;
  end else begin
    log('Kann ' + _File + ' nicht herunterladen, da FTP nicht verbunden ist!');
  end;
end;

MathiasBurbach 27. Jan 2007 01:35

Re: idFTP.Get - Destination file already exists
 
Zitat:

Zitat von berens
Also ich weiss nicht. Ich habe es nun mit der neuesten Version von Indy indy_vs10.1.5.exe versucht, ...

Hallo berens,

Recht herzlichen Dank für den Workaround. Ich habe jetzt auch versucht mit Hilfe von Indy.Sockets.dll die VCL.NET Abhängigkeit zu entfernen. Aber weder Version 10.1.5.17875 noch Version 10.1.5.33678 erlauben es mir meine WinForms Anwendung nur mit Indy.Sockets.dll & Mono.Security.dll zu kompilieren. Bei beiden Versionen beschwehrt sich BDS2006 mit folgender Fehlermeldung:
Zitat:

[Pascal Fatal Error] F2458 Cannot import metadata from Delphi 'library'. Use packages instead
Der entsprechende Newsgroup Thread "Problem using indy with delphi.net" hier ist auch nicht sehr ergiebig.
Offensichtlich ist diese Assembly für Visual Studio geschrieben und kommt ohne DCUIL/DCPIL Dateien. Kann ich sie dennoch in BDS2006 Delphi.NET verwenden? Wenn ja, wie?

Recht herzlichen Dank für eine kurze Antwort im Voraus.

Salut,
Mathias

p0w3r5tr34m3r 27. Jan 2007 09:30

Re: idFTP.Get - Destination file already exists
 
Zitat:

Zitat von berens
Delphi-Quellcode:
...
      IdFTP.Get(FileName, DestFileName); // <-- Liefert Fehler
      ...
      IdFTP.Get(t, GetRunDir + t, true, true);

Wieso 2x get ? liegt es vielleicht daran das er sagt "File already exists" ?

Mit freundlichen Grüßen

Daniel G 27. Jan 2007 09:37

Re: idFTP.Get - Destination file already exists
 
Zitat:

Zitat von p0w3r5tr34m3r
Wieso 2x get ? liegt es vielleicht daran das er sagt "File already exists" ?

Ich find's zwar auch merkwürdig, aber laut QT dürfte das trotzdem nicht passieren, da t und filename unterschiedliche Werte haben.

berens 27. Jan 2007 11:20

Re: idFTP.Get - Destination file already exists
 
Musst mich da auch erstmal durchlesen, des Thread is ja auch schon bissel älter.

Also das Programm lädt quasi eine Indexdatei herunter (files.txt), die geöffnet wird, und dann alle Dateien herunterlädt, die hier drinnen stehen. Je Zeile eine Datei. Die Datei files.txt ist natürlich nicht in sich selbst angegeben, und die Datei die angegeben sind existieren natürlich auf dem FTP in dem selben Ordner.

Deshalb gilt:

Filename = Indexdatei
t = jeweils andere "Daten"-Datei

berens 15. Mai 2007 15:07

Re: idFTP.Get - Destination file already exists
 
Vielleicht liegt es ja auch einfach an mir :/

Also: ich habe mittlerweile einen komplett anderen PC, Delphi 2007 und _kein_ .net.

Delphi-Quellcode:
// strFileName: TFileName

        DeleteFile(strFileName);

        Application.ProcessMessages;

        if not FileExists(strFileName) then begin

          ftp.Get(ExtractFileName(strFileName), strFileName, true, true); // <-- Hier

        end;
Wie kann es hier zu 'Destination file already exists.' kommen?

SMALLID 21. Aug 2007 16:49

Re: idFTP.Get - Destination file already exists
 
Das gleiche Problem habe ich auch und bin etwas angepisst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:36 Uhr.
Seite 1 von 2  1 2      

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