Jump to content


Photo

[RESUELTO] Función para guardar archivos


  • Please log in to reply
6 replies to this topic

#1 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 03 February 2011 - 12:16 PM

Hola

Pues si, alguien sabe de alguna función que me permita guardar un archivo y si existe otro con el mismo nombre le cambie el nombre al estilo de windows ?

Algo así:

ejemplo.txt
ejemplo(1).txt
ejemplo(2).txt
.....


Salud OS
  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4107 posts
  • LocationMadrid - España

Posted 03 February 2011 - 12:58 PM

Si te gusta que lo haga el Shell:



delphi
  1. function SHFileCopy(Source, Target: String): integer;
  2. var
  3.   FS: SHFILEOPSTRUCT;
  4. begin
  5.   ZeroMemory(@FS, sizeof(SHFILEOPSTRUCT));
  6.   FS.wFunc:= FO_COPY;
  7.   FS.pFrom:= PCHAR(Source + #0 + #0);
  8.   FS.pTo:= PCHAR(Target + #0 + #0);
  9.   FS.fFlags:= FOF_NOCONFIRMATION + FOF_RENAMEONCOLLISION;
  10.   Result:= SHFileOperation(FS);
  11. end;




Saludos.
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 03 February 2011 - 01:25 PM

Hola amigo escafandra

Una pregunta, esa funcion pide dos archivos, pero supongo que ya debo tener definido el nombre del otro archivo ¿estoy apreciando mal la función? es decir, yo quiero grabar un archivo y que automáticamente se le agregue la secuencia (1),(2),...,(n) si ya existiera un archivo con nombre identico.

Salud OS
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4107 posts
  • LocationMadrid - España

Posted 03 February 2011 - 01:38 PM

Si, esa función copia archivos y resuelve la colisión de nombres colocando "Copia de " delente del nombre en cuestión.

Si quieres conseguir un nombre que no colisione antes de guardar el archivo, puedes usar algo como esto:


delphi
  1. var
  2.   FileName,FileName0, FileExt: String;
  3.   n: integer;
  4. begin
  5.   FileName0:= 'MyFile';
  6.   FileExt:= '.txt';
  7.  
  8.   // Prepara el nombre de archivo
  9.   FileName:= ExtractFilePath(Application.ExeName) + FileName0 + FileExt;
  10.   n:= 1;
  11.   while FileExists(FileName) do
  12.   begin
  13.     FileName:= ExtractFilePath(Application.ExeName) + FileName0 + IntToStr(n)+ FileExt;
  14.     inc(n);
  15.   end;
  16.   // Y ahora escribo mi archivo....
  17. end;



Saludos.
  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 03 February 2011 - 01:57 PM

Ya, entiendo, gracias amigo escafandra.

Salud OS
  • 0

#6 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4266 posts
  • LocationCosta Rica

Posted 03 February 2011 - 02:02 PM

Hola
Y yo complicandome con un loadfromfile  :D :D

Muy interesante el codigo amigo escafandra.
Como me salen mejor los procedimientos.. *-)



delphi
  1. procedure TForm1.Guardar(FileName0, FileExt: String);
  2. var
  3.   FileName: String;
  4.   n: integer;
  5. begin
  6.   // Prepara el nombre de archivo
  7.   FileName:= ExtractFilePath(Application.ExeName) + FileName0 + FileExt;
  8.   n:= 1;
  9.   while FileExists(FileName) do
  10.   begin
  11.     FileName:= ExtractFilePath(Application.ExeName) + FileName0 + IntToStr(n)+ FileExt;
  12.     inc(n);
  13.   end;
  14.   // Y ahora escribo mi archivo....
  15.   Memo1.Lines.SaveToFile(FileName);
  16.   Showmessage('Archivo  ' + FileName0 + IntToStr(n-1) + '  Guardado');
  17. end;



Uso:



delphi
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. begin
  3. Guardar(Edit1.Text,'.txt');
  4. end;



Algo mas que aprendi. (y)

Saludos
  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4107 posts
  • LocationMadrid - España

Posted 03 February 2011 - 04:41 PM


...Como me salen mejor los procedimientos.. *-)


Puestos a jugar un poco con el código, se puede hacer una función general para encontrar el nombre sin usar:  :D :D



delphi
  1. function FileNameOnCollision(FileName: String): String;
  2. var
  3.   FileExt: String;
  4.   n: integer;
  5. begin
  6.   Result:= FileName;
  7.   FileExt:= ExtractFileExt(FileName);
  8.   SetLength(FileName, Length(FileName) - Length(FileExt));
  9.   n:= 2;
  10.   while FileExists(Result) do
  11.   begin
  12.     Result:= FileName + '(' + IntToStr(n) + ')' + FileExt;
  13.     inc(n);
  14.   end;
  15. end;



Ejemplo:

delphi
  1.   Label1.Caption:= FileNameOnCollision(ExtractFilePath(Application.ExeName) + 'texto.txt');




Saludos.
  • 0




IP.Board spam blocked by CleanTalk.