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

[RESUELTO] Función para guardar archivos
Started by
egostar
, Feb 03 2011 12:16 PM
6 replies to this topic
#1
Posted 03 February 2011 - 12:16 PM
#2
Posted 03 February 2011 - 12:58 PM
Si te gusta que lo haga el Shell:
Saludos.
delphi
function SHFileCopy(Source, Target: String): integer; var FS: SHFILEOPSTRUCT; begin ZeroMemory(@FS, sizeof(SHFILEOPSTRUCT)); FS.wFunc:= FO_COPY; FS.pFrom:= PCHAR(Source + #0 + #0); FS.pTo:= PCHAR(Target + #0 + #0); FS.fFlags:= FOF_NOCONFIRMATION + FOF_RENAMEONCOLLISION; Result:= SHFileOperation(FS); end;
Saludos.
#3
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
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
#4
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:
Saludos.
Si quieres conseguir un nombre que no colisione antes de guardar el archivo, puedes usar algo como esto:
delphi
var FileName,FileName0, FileExt: String; n: integer; begin FileName0:= 'MyFile'; FileExt:= '.txt'; // Prepara el nombre de archivo FileName:= ExtractFilePath(Application.ExeName) + FileName0 + FileExt; n:= 1; while FileExists(FileName) do begin FileName:= ExtractFilePath(Application.ExeName) + FileName0 + IntToStr(n)+ FileExt; inc(n); end; // Y ahora escribo mi archivo.... end;
Saludos.
#5
Posted 03 February 2011 - 01:57 PM
Ya, entiendo, gracias amigo escafandra.
Salud OS
Salud OS
#6
Posted 03 February 2011 - 02:02 PM
Hola
Y yo complicandome con un loadfromfile
Muy interesante el codigo amigo escafandra.
Como me salen mejor los procedimientos..
Uso:
Algo mas que aprendi.
Saludos
Y yo complicandome con un loadfromfile


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

delphi
procedure TForm1.Guardar(FileName0, FileExt: String); var FileName: String; n: integer; begin // Prepara el nombre de archivo FileName:= ExtractFilePath(Application.ExeName) + FileName0 + FileExt; n:= 1; while FileExists(FileName) do begin FileName:= ExtractFilePath(Application.ExeName) + FileName0 + IntToStr(n)+ FileExt; inc(n); end; // Y ahora escribo mi archivo.... Memo1.Lines.SaveToFile(FileName); Showmessage('Archivo ' + FileName0 + IntToStr(n-1) + ' Guardado'); end;
Uso:
delphi
procedure TForm1.Button2Click(Sender: TObject); begin Guardar(Edit1.Text,'.txt'); end;
Algo mas que aprendi.

Saludos
#7
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:


delphi
function FileNameOnCollision(FileName: String): String; var FileExt: String; n: integer; begin Result:= FileName; FileExt:= ExtractFileExt(FileName); SetLength(FileName, Length(FileName) - Length(FileExt)); n:= 2; while FileExists(Result) do begin Result:= FileName + '(' + IntToStr(n) + ')' + FileExt; inc(n); end; end;
Ejemplo:
delphi
Label1.Caption:= FileNameOnCollision(ExtractFilePath(Application.ExeName) + 'texto.txt');
Saludos.