Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   FindFirst (https://www.clubdelphi.com/foros/showthread.php?t=40099)

waltrapa 07-02-2007 11:36:14

FindFirst
 
Buenos dias tengo un pequeño problema y no se si alguien puede ayudarme.

Tengo el siguiente código que recorre un directorio en busca de ficheros de texto para ser tratados con la función FindFirst.

Código:

  try
    FileAttrs:=SysUtils.faAnyFile;
    if(FindFirst(self.FPath + '*.txt',FileAttrs,Filename)=0) then
    begin
      repeat
        if (FileName.Attr and FileAttrs)=FileName.Attr then
        begin

El problema viene en el último if donde valido los atributos. En ocasiones y sin aparentemente seguir un orden lógico, algunos archivos no "pasan" la validación del if y por tanto no se tratan. He validado los atributos de estos archivos y no he encontrado nada extraño.
¿Alguien se ha encontrado con este mismo problema? Gracias.

dec 07-02-2007 12:04:00

Hola,

No estoy cien por cien seguro pero creo que la condición debería quedar algo así:

Código Delphi [-]
if (FileName.Attr and FileAttrs) = FileAttrs then

Edito: Parece que no es como yo digo (luego de revisar en la ayuda) y es como tú dices.

waltrapa 07-02-2007 12:16:21

FindFirst
 
Buenas Dec, primero muchas gracias por tu rapida respuesta.
He probado lo que me comentabas y no me ha funcionado.
He consultado la ayuda de Delphi y creo que según el ejemplo que allí aparece la sintaxis es correcta.
Lo más curioso del tema es que este proceso funciona bien, solo que en algunas ocasiones para algunos ficheros de forma extraña no funciona y los ficheros no parecen tener nada extraño.

ArdiIIa 07-02-2007 13:32:52

Código Delphi [-]
 sr: TSearchRec;

    if findFirst(FTempDir + '*.*',faAnyFile ,sr) = 0 THEN
     REPEAT
     DeleteFile(FTempDir + SR.Name);
     until FindNext(sr) <> 0;
     FindClose(sr);

Esto si funciona... No veo el final de tu bucle...

waltrapa 07-02-2007 14:09:45

Muchas gracias por la ayuda que me habeis dado.
Sobre lo que comentabas he probado el código que me has pasado y efectivamente funciona. Gracias de nuevo.
Sin embargo donde tengo el problema es en el if que evalua los atributos del fichero que debe tratar:

Código Delphi [-]
if (FileName.Attr and FileAttrs)=FileName.Attr then

El problema es que como me pasa de forma aleatória es dificil de encontrar el porque, pero creo que tal vez lo haya descubierto.
Os cuento a ver si esto tiene lógica:

Mirando la ayuda con relación a Filename.Attr menciona que devuelve los atributos del fichero. Entre otros puede tomar dos constantes, faArchive y faSysLink con los valores 32 y 64 respectivamente. En una de las ocasiones que he conseguido reproducir el valor he visto que mientras que yo esperaba recibir un valor 32 (faArchive) me llegaba un 64.
Estos archivos no los copio yo sino que solo los recibo y trato. Con esto si abro uno de los ficheros y lo grabo de nuevo, funciona.
Entiendo por tanto que en ocasiones estos archivos no me los graban de forma correcta o bien los atributos no estan correctos.

Después de este rollo he optado por cargarme el if y validar de otras formas.

Por cierto sobre el final del bucle, este trata el fichero y acaba con un FindNext, pero como en principio ví que el problema lo tenia en el if, ya ni lo puse.

Repito, muhas gracias por la ayuda.


La franja horaria es GMT +2. Ahora son las 17:45:31.

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