Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: bonmario - Agosto 14, 2013, 09:59:29 am

Titolo: Spostare un file
Inserito da: bonmario - Agosto 14, 2013, 09:59:29 am
Ciao a tutti,
scusate la domanda banale, ma sono io che non la trovo, oppure non esiste una funzione per spostare un file?
Per il momento ne ho fatto una io che copia il file e poi cancella quello di partenza, ma dal punto di vista delle performances fa pena !!!

P.S. Sono su linux.

Ciao, Mario
Titolo: Re:Spostare un file
Inserito da: Legolas - Agosto 14, 2013, 12:54:53 pm
In Lazarus freepascal c'è la funzione RenameFile, che è un wrapper di MoveFile su windows e fprename su linux.
Titolo: Re:Spostare un file
Inserito da: brunello - Agosto 14, 2013, 01:03:54 pm
io userei TProcess
http://wiki.freepascal.org/Executing_External_Programs/it
poi per linux utilizzarei il classico mv file_da_spostare directory_di_destinazione
mentre per windows il comando move
ciao Brunello
Titolo: Re:Spostare un file
Inserito da: bonmario - Agosto 14, 2013, 01:13:04 pm
Grazie a tutti e 2.

La rename va "quasi" bene. Leggendo qui http://www.freepascal.org/docs-html/rtl/sysutils/renamefile.html infatti dice che in Linux fallisce nel caso in cui sorgente e destinazione sono in partizioni differenti. Per aggirare il problema, mi sono fatto la funzione qui sotto:

Codice: [Seleziona]
  function  SpostaFile(FilePart, FileDest:String):Bool;
  begin
    //Se non esiste il file di partenza, è inutile proseguire
    if (not FileExistsUTF8(FilePart)) then begin
      Result:=False;
    end else begin
      try
        //Cancello il file di destinazione
        DeleteFileUTF8(FileDest);

        //RenameFileUTF8 fa anche la move, ma non funziona in linux se sorgente e destinazione
        //sono su partizioni diversi.
        //Per gestire la cosa faccio così: provo con RenameFileUTF8, se non funziona,
        //faccio la copia e la cancellazione del file di partenza
        Result:=RenameFileUTF8(FilePart, FileDest);
        if (not Result) then begin
          //Copio il file ...
          Result:=FileUtil.CopyFile(PChar(FilePart), PChar(FileDest), True);

          //... se è tutto Ok, cancello il file di partenza
          if Result then begin
            Result:=DeleteFileUTF8(FilePart);
          end;
        end;
      except
        //Se c'è stato un errore durante lo la copia o la cancellazione, faccio in modo
        //che il programma non si interrompa
        Result:=False;
      end;
    end;
  end;


Ciao, Mario