Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda Comparacion. (https://www.clubdelphi.com/foros/showthread.php?t=78531)

Paco Fernandez 27-04-2012 00:38:25

Ayuda Comparacion.
 
Hola, bueno me ha surgido un problema, estoy intentando comparar 2 listbox me explico.

Cargo en 2 listbox el contenido de 2 carpetas
Si en 1 listbox tengo a paco.exe y perez.exe y en el segundo Listbox otro a paco.exe y juanjo.exe

Juanjo.exe es diferente a los otros y como es diferente a el primer textbox quiero que se borre el archivo.

Por el foro , lei una funcion que borraba el contenido de un directorio , era de "marcoszorrilla"
Pero en este caso quiero borrar archivos de un directorio que no sean iguales a otro directorio
a traves de 2 listbox, se como cargar y que se muestren , me faltaria esta parte.
no la entendi muy bien, y la comparacion iria por los operadores en este caso seria " a<>b " no? si estoy equivocado corriganme , pero no se como aplicarlo para borrar los archivos desiguales.

Gracias si pueden ayudarme me vendria muy bien

gatosoft 27-04-2012 01:10:35

No se si entendí bien Paco...

Puedes comenzar con un recorrido sobre la lista dos, donde están los archivos que potencialmente quieres borrar.
Tomas cada elemento y lo buscas en la lsita uno... puede ser con

Código Delphi [-]
resultado:= ListBox1.Items.IndexOf(NombreDelArchivo)

Si el resultado es -1 quiere decir que el archivo no ha sido encontrado y lo eliminas físicamente con

Código Delphi [-]
SysUtils.DeleteFile(RutaDelArchivo +  NombreDelArchivo);

¿Si entendí bien lo que querías?

Paco Fernandez 27-04-2012 06:37:36

Mas o menos asi la ruta ya estaria indicada y de esa carpeta ya cargarian al list eso ya perfect

es algo asi lo que quiero parecido a lo que me has dicho mira, por ejemplo:
ListBox1.Items <> Listbox2.Items
Si son desiguales los elementos de una lista y otra, que se borren pero no de la lista si no los archivos asi en bruto.

Las carpetas que contienen los archivos, previamente fueron cargadas y marcadas en un edit, para no tener que meter la ruta en el code.

Si el nombre de un archivo de listbox1 no aparece en el listbox2 , que se borre el archivo de diferente nombre del listbox2 no se si me explico

Es hay mi gran duda

ecfisa 27-04-2012 08:49:29

Hola Paco Fernandez.

Si deseas que se borren los archivos de determinadas carpetas sin mediar intervención del usuario, no hay necesidad de usar ListBox, digamos que los únicos componentes visuales requeridos son dos TEdit para ingresar las rutas a las carpetas.

Lo que no especificaste y no tengo en claro, es si queres:
  1. Borrar de la carpeta A todos los archivos que no esten en la carpeta B.
  2. Borrar de la carpeta B todos los archivos que no esten en la carpeta A.
  3. Borrar de la carpeta A y de la carpeta B los archivos que no están en ambas carpetas.
Por lo que voy directo al tercer caso ya que contempla los dos anteriores. Una forma podría ser:
Código Delphi [-]
(* Cargar archivos al TStrings pasado en TSFiles *)
procedure AddFiles(ADir: string; TSFiles: TStrings);
var
  SR: TSearchRec;
begin
  TSFiles.Clear;
  ADir:= IncludeTrailingPathDelimiter(ADir); // Incluir backslash
  // Busqueda
  if FindFirst(ADir + '*.*', faArchive, SR)= 0 then
  repeat
    TSFiles.Add(Adir + SR.Name); // Añadir
  until FindNext(SR) <> 0;
end;

(* Borrar archivos de Dir1 que no esten en Dir2 y de Dir2 que no esten en Dir1 *)
procedure DeleteDistinctFiles(Dir1, Dir2: string);
var
  TS1, // almacena archivos de Dir1
  TS2, // almacena archivos de Dir2
  ToDelete: TStrings; // almacena archivos a borrar
  i,j: Integer;
  Equal: Boolean;
begin
  TS1:= TStringList.Create;
  TS2:= TStringList.Create;
  ToDelete:= TStringList.Create;
  try
    // Cargar archivos Dir1 y Dir2
    AddFiles(Dir1, TS1);
    AddFiles(Dir2, TS2);
    // Encontrar archivos de Dir1 que no estan en Dir2
    for i:= 0 to TS1.Count-1 do
    begin
      Equal:= False;
      for j:= 0 to TS2.Count-1 do
        if ExtractFileName(TS1[i]) = ExtractFileName(TS2[j]) then
          Equal:= True;
      if not Equal then ToDelete.Add(TS1[i]); // agregarlo para borrar
    end;
    // Encontrar archivos de Dir2 que no estan en Dir1
    for i:= 0 to TS2.Count-1 do
    begin
      Equal:= False;
      for j:= 0 to TS1.Count-1 do
        if ExtractFileName(TS2[i]) = ExtractFileName(TS1[j])then
          Equal:= True;
      if not Equal then ToDelete.Add(TS2[i]); // agregarlo para borrar
    end;
    // Borrar archivos seleccionados
    for i:= 0 to ToDelete.Count-1 do
      DeleteFile(ToDelete[i]);
  finally
    TS1.Free;
    TS2.Free;
    ToDelete.Free;
  end;
end;

Llamada ejemplo:
Código Delphi [-]
   DeleteDistinctFiles(Edit1.Text, Edit2.Text);

Saludos.

Paco Fernandez 28-04-2012 13:55:01

Una verdadera maravilla de codigo amigo, eres grande .

Mas que nada es como la opcion 2 , pero creo que pensando un poco podre aplicarlo pa la funcion 2

Tremendo codigo, muchas gracias sobre todo por comentarlo asi entiendo como funciona y me sirve bastante mas.


La franja horaria es GMT +2. Ahora son las 00:59:37.

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