zapis/odczyt FTP

0

Może moje pytanie wyda się banalnie proste, ale przyżekam, że wykonałem wszystkie możliwe czynności sugerowane w dziale "zanim napiszesz" i nie znalazłem odpowiedzi na moje pytanie.

Chcę napisać program, który sterowałby działem "linki" na mojej stronie. Plik linki.txt jest inkludowany na stronie we właściwym miejscu.

Wykorzystałem tu klienta FTP z Indy, oto jego ustawienia:

user image

Kod wczytywania danych (każdej linii osobno do ListBox'a), który nie działa:

procedure TForm1.FormCreate(Sender: TObject);
 Var
  TF : TextFile;
  S : String;
begin
  DeleteFile('C:\linki.txt');
  idFTP1.Connect;
  IdFTP1.get('www\linki.txt', 'C:\linki.txt'); //plik znajduje się w folderze www
  idFTP1.Disconnect;
  AssignFile(TF, 'C:\linki.txt');
  Reset(TF);
  while not eof(TF) do
  begin
    Readln(TF, S);
    ListBox1.Items.Add(S)
  end;
  CloseFile(TF);
end;

otóż gdy duszę "Run" po pewnym czasie wyskakuje komunikat:


Debugger Exception Notification

Project editor.exe raised exception class EIdFTPFileAlreadyExists with message 'Destination file already exists.'. Process stopped. Use Step or Run to continue.

0

Sprawdz parametry pliku - czy jest "tylko do odczytu", jeżeli tak zmień je.
Następnie wywołaj funkcję get wówczas gdy nie ma pliku na dysku lokalnym, jak na poniższym przykładzie:

procedure TForm1.FormCreate(Sender: TObject);
var
  TF : TextFile;
  S : String;
begin
  if fileexists ('C:\linki.txt') then
  begin
    if FileIsReadOnly(Pchar('C:\linki.txt')) then
    begin
      //zmiana własciwości pliku: usunięcie atrubutów tylko do doczytu
      FileSetReadOnly(Pchar('C:\linki.txt'), false);
     end;
     if not FileIsReadOnly(Pchar('C:\linki.txt')) then
     begin
       DeleteFile('C:\linki.txt');
      end;
  end;

  if not fileexists ('C:\linki.txt') then
  begin
    idFTP1.Connect;
    IdFTP1.get('www\linki.txt', 'C:\linki.txt'); //plik znajduje się w folderze www
    idFTP1.Disconnect;
    AssignFile(TF, 'C:\linki.txt');
    Reset(TF);
    while not eof(TF) do
    begin
      Readln(TF, S);
      ListBox1.Items.Add(S)
    end;
    CloseFile(TF);
  end;
end;

:)

0

jednak nie w tym sęk....
nadal ten sam komunikat - "destination file already exist'
może dodam jeszcze, że w pliku IdFTP.pas zaznacza się wtedy linia

raise EIdFTPFileAlreadyExists.Create(RSDestinationFileAlreadyExists);

w procedurze:

procedure TIdFTP.Get(const ASourceFile, ADestFile: string; const ACanOverwrite: boolean = False;
  AResume: Boolean = false);
var
  LDestStream: TIdStream;
begin

    AResume := AResume and CanResume;
    if ACanOverwrite and (not AResume) then begin
      Sys.DeleteFile(ADestFile);
      LDestStream := TFileCreateStream.Create(ADestFile);
    end else begin
      if (not ACanOverwrite) and AResume then begin
        LDestStream := TAppendFileStream.Create(ADestFile);
      end else begin
        raise EIdFTPFileAlreadyExists.Create(RSDestinationFileAlreadyExists);
      end;
    end;

  try
    Get(ASourceFile, LDestStream, AResume);
  finally
    Sys.FreeAndNil(LDestStream);
  end;
end;

</delphi>

0

W funkcji deletefile użyj rzutowania:
deletefile(pchar('c:\linki.txt'));

Według mnie powinno raczej chodzić ... :)

0

Może plik: 'C:\linki.txt' juz istnieje na dysku a funkcja get go nie nadpisuje ?
Moze najpierw usuń ten plik albo:
IdFTP1.get('www\linki.txt', 'C:\linki.txt', True); //plik znajduje się w folderze

0

Z tego co pamiętam Idftp1.Get ma tylko dwa parametry (plik źródłowy, plik docelowy). Co do usuwania pliku: powyżej opisałem sposób na usunięcie atrybutu tylko do odczytu oraz usunięcia pliku z dysku. Dopiero gdy nie ma pliku (if not fileexists ...) wykonywane jest pobieranie pliku.

0

procedure Get(const ASourceFile: string; ADest: TStream; AResume: Boolean = false); overload;

Ma 3 parametry tylko 3 domyślnie jest ustaiony jako false, no ale nie wiem czy to rozwiąrze problem, raczej wątpliwe

0

rzeczywiście.... True załatwiło sprawę, ale teraz wyskakuje inny błąd - "not such a directory or file "www/linki.txt". Czy ktoś wie, jak dostać się FTP klientem do folderu na serwerze ??

0
torba.borba napisał(a)

rzeczywiście.... True załatwiło sprawę, ale teraz wyskakuje inny błąd - "not such a directory or file "www/linki.txt". Czy ktoś wie, jak dostać się FTP klientem do folderu na serwerze ??

zapewne trzeba wpisać poprawną ścieżkę :>

0

a moze sproboj otworzyć ten katalog i pobrać plik:
chyba tak nie jestem w 100% pewien bo nie sprawdzałem:

idFTP1.Connect;
idftp1.ChangeDir('www');
IdFTP1.get('linki.txt', 'C:\linki.txt',TRUE);
idFTP1.Disconnect;

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0