Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   si archivo existe renombrar con parametro (https://www.clubdelphi.com/foros/showthread.php?t=76707)

jonydread 20-11-2011 23:23:53

si archivo existe renombrar con parametro
 
hola amigos como el titulo dice
verifico si existe fichero de destino y muestro un mensaje si desea reemplazar
pero quiero eliminar eso y si existe nombrar con una constante por ejemplo
si existe miarchivo.zzz
nombrar como miarchivo(1).zzz
si existe miarchivo(1).zzz
nombrar como miarchivo(2).zzz
y así sucesivamente...

gracias
Saludos!!

ecfisa 21-11-2011 10:49:09

Hola.

Una forma podría ser:
Código Delphi [-]
...
uses StrUtils;

procedure TomarNombre(Nombre: string; var Nuevo: string);
var
  Num: Integer;
  Ext: string;
begin
  if FileExists(Nombre) then
  begin
    Ext := ExtractFileExt(Nombre);
    Nombre := LeftStr(Nombre, Length(Nombre) - Length(Ext));
    if Pos('(', Nombre) = 0 then
    begin
      Num := 1;
      Nombre := Nombre + '(' + IntToStr(Num) + ')' + Ext;
    end
    else
    begin
      Num := StrToInt(Copy(Nombre, Pos('(', Nombre)+1,
        PosEx(')',Nombre, Pos('(', Nombre))-Pos('(', Nombre)-1));
      Inc(Num);
      Nombre := Copy(Nombre,1,Pos('(', Nombre)-1)+'('+IntToStr(Num)+')' + Ext;
    end;
    if FileExists(Nombre) then
      TomarNombre(Nombre, Nombre);
  end;
  Nuevo:= Nombre;
end;

Llamada de ejemplo:
Código Delphi [-]
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.LoadFromFile('C:\MIARCHIVO.TXT');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  TomarNombre('C:\MIARCHIVO.TXT', s);
  Memo1.Lines.SaveToFile(s);
end;

Un saludo.

jonydread 21-11-2011 13:46:23

hola amigo gracias por tu tiempo
aplique el codigo aqui pero no me funciona
Código Delphi [-]
procedure TReg2infConverter.Button2Click(Sender: TObject);
var Origen, Destino,FileName,Path,s: string;
begin
if ExtractFileExt(opendialog1.FileName) = '.reg' then
begin
TomarNombre(opendialog1.FileName, s);
Path:=GetshortName(ExtractFilePath(Opendialog1.FileName));
Filename := Extractfilename(opendialog1.FileName);
Origen := GetshortName(opendialog1.FileName);
Filename:= AnsiReplaceStr(Filename,' ','');
Destino :=ChangeFileExt(Filename, '.inf');
LlamarReg2inf(Handle,'reg2inf.exe',Origen,path+Destino );
end else
MessageDlg('Archivo invalido!', MtError, [mbOK],0);
end;
he probado de diferentes formas pero no me resulta que hago mal??

ecfisa 21-11-2011 16:17:20

Hola.

Con respecto a ese código no sé ya que hay muchos factores involucrados que pueden estar provocando el fallo.

Pero para que realizes la prueba, te pongo un procedimiento que llama a la función TomarNombre utilizando un TOpenDialog y realiza correctamente lo que buscabas.
Código Delphi [-]
...
implementation

uses StrUtils;

procedure TomarNombre(Nombre: string; var Nuevo: string);
var
  Num: Integer;
  Ext: string;
begin
  if FileExists(Nombre) then
  begin
    Ext := ExtractFileExt(Nombre);
    Nombre := LeftStr(Nombre, Length(Nombre) - Length(Ext));
    if Pos('(', Nombre) = 0 then
    begin
      Num := 1;
      Nombre := Nombre + '(' + IntToStr(Num) + ')' + Ext;
    end
    else
    begin
      Num := StrToInt(Copy(Nombre, Pos('(', Nombre)+1,
        PosEx(')',Nombre, Pos('(', Nombre))-Pos('(', Nombre)-1));
      Inc(Num);
      Nombre := Copy(Nombre,1,Pos('(', Nombre)-1)+'('+IntToStr(Num)+')' + Ext;
    end;
    if FileExists(Nombre) then
      TomarNombre(Nombre, Nombre);
  end;
  Nuevo:= Nombre;
end;

// codigo de prueba
procedure TForm1.Button1Click(Sender: TObject);
var
  Ori, Des: TMemoryStream;
  i: Integer;
  b: Byte;
  Nombre: string;
begin
  if OpenDialog1.Execute then
  begin
    Ori:= TMemoryStream.Create;
    Des:= TMemoryStream.Create;
    try
      Ori.LoadFromFile(OpenDialog1.FileName);
      TomarNombre(OpenDialog1.FileName, Nombre);
      for i:= 0 to Ori.Size - 1 do
      begin
        Ori.Read(b, 1);
        Des.Write(b, 1)
      end;
      Des.SaveToFile(Nombre)
    finally
      Ori.Free;
      Des.Free
    end;
  end;
end;
end.

Un saludo.

jonydread 21-11-2011 18:23:37

muchas gracias funciona perfecto!!

escafandra 22-11-2011 01:11:39

Hace varios meses publiqué una función para encontrar un nombre de archivo no repetido y proponer un nuevo nombre como lo hace Windows. La fuente es esta y el código este:

Código 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 de uso:
Código Delphi [-]
  Label1.Caption:= FileNameOnCollision(ExtractFilePath(Application.ExeName) + 'texto.txt');


Saludos.

jonydread 22-11-2011 01:45:54

Cita:

Empezado por escafandra (Mensaje 419051)
Hace varios meses publiqué una función para encontrar un nombre de archivo no repetido y proponer un nuevo nombre como lo hace Windows. La fuente es esta y el código este:

Código 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 de uso:
Código Delphi [-]
  Label1.Caption:= FileNameOnCollision(ExtractFilePath(Application.ExeName) + 'texto.txt');


Saludos.

Gracias! guardare la fuente!!

jonydread 27-11-2011 03:23:07

estoy usando este codigo
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Ori, Des: TMemoryStream;
  i: Integer;
  b: Byte;
  Nombre: string;
begin
  if OpenDialog1.Execute then
  begin
    Ori:= TMemoryStream.Create;
    Des:= TMemoryStream.Create;
    try
      Ori.LoadFromFile(OpenDialog1.FileName);
      TomarNombre(OpenDialog1.FileName, Nombre);
      for i:= 0 to Ori.Size - 1 do
      begin
        Ori.Read(b, 1);
        Des.Write(b, 1)
      end;
      Des.SaveToFile(Nombre)
    finally
      Ori.Free;
      Des.Free
    end;
la verdad no me habia percatado que el archivo solo copia y le cambia el nombre al de origen no lo procesa como puedo hacer el llamado
Código Delphi [-]
LlamarReg2inf(Handle,'reg2inf.exe',Origen,path+Destino );

gracias!!

ecfisa 28-11-2011 00:10:26

Cita:

Empezado por jonydread (Mensaje 419569)
como puedo hacer el llamado
Código Delphi [-]
LlamarReg2inf(Handle,'reg2inf.exe',Origen,path+Destino );

gracias!!

Hola.

El llamado tál como lo mostras en esa línea es correcto. Mas o menos he ido siguiendo los pasos de la aplicación que estás realizando en los hilos: 1, 2, 3, 4, 5, 6 y todas las funciones que han ido sugiriendo sobre el tratamiento previo de los parámetros a enviar realizan bién su cometido.

Y creo que la principal dificultad radica en que desconocemos que es reg2inf.exe, que hace y como lo hace. Es decir que se pierde todo control sobre las acciones que se harán sobre los parámetros 'Origen' y 'Destino' una vez enviados mediante ShellExecute a reg2inf.exe...


Un saludo.

jonydread 28-11-2011 01:45:13

si gracias Disculpa ya lo solucione
y gracias por todo es mi primera vez incursionando delphi asiendo este programa para simplificar el uso su ayuda me ha servido de mucho para aprender y la pagina tambien.
cuando termine les dejo el codigo completo ya que lo diseñe sin saber mucho de estos codigos y me gustaria compartir con alguien que le sirva
aqui esta el reg2inf.exe sirve para realizar tweaks del registro de windows en cd de instalacion.
Saludos ecfisa gracias por tu ayuda.


La franja horaria es GMT +2. Ahora son las 05:28:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi