Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Comportamiento extraño en StringList (https://www.clubdelphi.com/foros/showthread.php?t=44942)

MaMu 19-06-2007 00:09:09

Comportamiento extraño en StringList
 
Resulta que yo escaneo constantemente un directorio, para saber si hay algun subdirectorio nuevo, y si lo hay o no lo hay, lo cargo en un StringList (este lo creo al crearse la form y lo libero al cerrar la misma, sin problemas)
Utilizo la siguiente function:

Código Delphi [-]
function NumeroSubDirectorios(directorio: string;
   ocultos, sistema, soloLectura: boolean) : integer;
 var
   SR: TSearchRec;
   atributos: Cardinal;
 begin
   Lista.Clear;
   Result := 0;
   atributos := faDirectory;
   if ocultos then atributos := atributos or faHidden;
   if sistema then atributos := atributos or faSysFile;
   //if soloLectura then atributos := atributos or faReadOnly;
   directorio := IncludeTrailingPathDelimiter(directorio);
   if FindFirst(directorio +'*', atributos, SR) = 0 then
   begin
     repeat
       if (SR.Name <> '.') and (SR.Name <> '..')
         and DirectoryExists(directorio + SR.Name)
         then begin
              Lista.Add(SR.Name);
              Inc(Result);
         end;
     until FindNext(SR) <> 0;
     SysUtils.FindClose(SR);
   end;
 end;

Pero si bien, puedo mostrar el resultado de la funcion conrrectamente, ya que cuenta bien, no me pasa lo mismo con la Lista (TStringList), ya que no siempre me muestra el ultimo directorio que cuenta en:

Código Delphi [-]
Label1.Caption:=Lista.Strings[Lista.Count-1];

En ciertos casos me añade como ultimo elemento al anterior, es decir lo repite, y a veces no. Esto lo pruebo copiando directorios al directorio que estoy escanenando. Porque pasa esto????

Saludos

MaMu 19-06-2007 01:53:27

Es rarisimo, sigo sin poder solucionarlom y lo unico que necesito hacer es leer los nombres de los subdirectorios que contiene un determinado directorio (ni siquiera en foma recursiva) y de ahi obtener el nombre del ultimo de la lista.

:( Alguien conoce una mejor forma de hacerlo o alguna otra alternativa?

Saludos

droguerman 19-06-2007 02:19:03

esa lista no la tienes como variable ni como parámetro entonces debe ser una propiedad, lo más lógico de pensar es que hay algun otro método que accesa a ella y que está modificandola

MaMu 19-06-2007 02:39:03

Cita:

Empezado por droguerman
esa lista no la tienes como variable ni como parámetro entonces debe ser una propiedad, lo más lógico de pensar es que hay algun otro método que accesa a ella y que está modificandola

La tengo declarada como variable aca:

Código Delphi [-]
...
var
  Main: TMain;
  Lista: TStrings;
....

Sino, como tendria que hacerlo?

Neftali [Germán.Estévez] 19-06-2007 09:54:27

Tal vez sea problema de la rutina que lo rellena; Hay un truco en el ClubDelphi (no recuerdo cual exactamente) que rellena en un TStringList todos los ficheros de un directorio de forma recursiva.
Pruébala y así descartas esa parte de código (para detectar que no tenga errores).

Mick 19-06-2007 12:30:59

Posibilidad que se me ocurre,

Si se estan creando continuamente directorios o archivos, parece normal que pueda pasar eso , por una simple problema de concurrencia, que se da siempre que varios procesos acceden a los mismos datos, sin realizacion de bloqueos.

Cuando se añade un subdirectorio o archivo nuevo al disco, la lista de archivos de ese directorio se modifica, ya que se tiene que insertar o añadir el nuevo archivo en la lista.

De modo que cuando el programa en delphi esta recorriendo la lista, en el medio de este proceso, esta es modificada, creciendo o disminuyendo o cambiando la lista de archivos de orden y de posicion.

En ese caso lo que habria que hacer es configurar el stringlist para que no admita duplicados:

Lista.Duplicates:= dupIgnore;

De este modo se evita que en el stringlist se añada dos veces el mismo archivo.

Aunque la forma buena de hacer lo que pretendes seria, usar las funciones del api que avisan cuadno hay modificaciones en una carpeta:
FindFirstChangeNotification
FindNextChangeNotification
ReadDirectoryChangesW
WaitForSingleObject
etc..

Saludos

Delfino 19-06-2007 16:15:12

Has probado el componente JvSearchFiles de la JVCL?

MaMu 19-06-2007 19:07:07

SOLUCIONADO

Cita:

Empezado por Delfino
Has probado el componente JvSearchFiles de la JVCL?

Si Delfino, tenia la JVCL instalada y no habia notado este componente, es exelente!!! y lo solucioné con el. El problema del stringlist lo descarte, puesto a que la lista se modifica en otro procedure que no puedo evitar. Asi que lo hice con este componente y me ahorre dolores de cabeza.

Mil gracias a todos.


La franja horaria es GMT +2. Ahora son las 18:39:12.

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