Contar ficheros de una carpeta

340 views
Skip to first unread message

JOSE MANUEL GONZALEZ

unread,
Feb 7, 2019, 2:17:57 PM2/7/19
to publice...@googlegroups.com
Tengo la siguiente paradoja: 
Necesito contar el número de ficheros PDF. Uso la función ADIR().
Todo va bien, pero cuando en la carpeta está vacía me cuenta un fichero..
¿Alguien sabe por qué pasa y como evitarlo?
Gracias.
José    :-)

---------- Forwarded message ---------
From: Víctor A. Hidalgo <victor...@gmail.com>
Date: jue., 7 feb. 2019 17:59
Subject: [vfp] Re: Nueva sqldata.dll 30.01.0001 via CURSORADAPTER y ADO y nueva sqldata2 30.01.0001 via CURSORADAPTER y ODBC
To: Comunidad de Visual Foxpro en Español <publice...@googlegroups.com>



Saludos Sr. Valdez:

Le informo que he probado la clase sqldata2.vcx con Firebird-3.0.4.33054 64 y 32 y Firebird_ODBC_2.0.5.156.

La conexion se efectua bien pero al momento de llamar una tabla el proceso se ejecuta sin error pero no trae ninguna tabla.

Si algunos de ustedes ha tenido resultados diferente favor de informar con que version de Firebird lo consiguieron.

Gracias.


 

Irwin Rodriguez

unread,
Feb 7, 2019, 2:43:19 PM2/7/19
to publice...@googlegroups.com
Puede que demore unos milisegundos más pero intenta hacer un FILE() iterando el ARRAY.

Saludos...!!!
--
Irwin Rodríguez
Analista Programador

+593 0994903424
Latacunga - Ecuador
"Un equipo solo son piezas que intercambias hasta que terminas el trabajo, es eficiente, funciona."

JOSE MANUEL GONZALEZ

unread,
Feb 7, 2019, 4:48:58 PM2/7/19
to publice...@googlegroups.com
Perdona mi desconocimiento, pero fle()  devuelve valores .T.  o .F.
¿Como obtengo la cantidad de ficheros pdf?
Gracias.
José   :-)

JOSE MANUEL GONZALEZ

unread,
Feb 7, 2019, 4:49:00 PM2/7/19
to publice...@googlegroups.com
Perdona mi desconocimiento, pero fle()  devuelve valores .T.  o .F.
¿Como obtengo la cantidad de ficheros pdf?
Gracias.
José   :-)

HernanCano

unread,
Feb 7, 2019, 11:20:38 PM2/7/19
to Comunidad de Visual Foxpro en Español
Jose:
En mis pruebas no he obtenido el resultado 1 cuando con ADIR() busco archivos en una carpeta vacía.
¿Puedes mostrarnos cómo usas ADIR() ?

ZeRoberto

unread,
Feb 8, 2019, 12:00:03 AM2/8/19
to publicesvfoxpro
A mi tampoco me da 1 si es que la carpeta esta vacia o no contiene los archivos de la mascara

Saludos



JOSE MANUEL GONZALEZ

unread,
Feb 8, 2019, 2:25:11 AM2/8/19
to publice...@googlegroups.com
Te envio el codigo

SELECT A
*USE E:\SEGISCONTA\DATOS\EMPRESAS.dbf SHARED
GO TOP
DELTA = 0
DO WHILE .NOT. EOF()
SELECT A
VNOMBREMP = NOMBRE
VCODIGO100 = CODIGO
RUTACONTAR2 = ALLTRIM("E:\SCANNER\EXPORTAR\2019\"+VCODIGO100)
RUTACONTAR3 = DIRECTORY("&RUTACONTAR2")
IF RUTACONTAR3 = .T.
Dimension arreglo[1,5] 
DELTA = 0
SET DEFA TO ALLTRIM("E:\SCANNER\EXPORTAR\2019\"+VCODIGO100)
=ADIR(arreglo,"*.PDF") 
DELTA = ALEN(arreglo,1)
SELECT B
GO BOTT
APPEND BLANK
REPLACE CODIGO WITH VCODIGO100 
REPLACE NOMBRE WITH VNOMBREMP
IF delta = 1
REPLACE TOTAL WITH 0
ELSE
REPLACE TOTAL WITH DELTA
ENDIF
DELTA = 0
SELECT A
IF EOF()
EXIT
ELSE
SKIP 1
LOOP
ENDIF
ENDIF
ENDDO
SELECT B
SET FILTER TO TOTAL > 0
GO TOP

ThisForm.Grid1.Refresh

ZeRoberto

unread,
Feb 8, 2019, 4:03:33 AM2/8/19
to publicesvfoxpro
Solo tienes que hacer esto


lnCant = Adir (laArchivos, "*.pdf")

? lnCant


Saludos 

JOSE MANUEL GONZALEZ

unread,
Feb 8, 2019, 6:26:41 AM2/8/19
to publice...@googlegroups.com
Ya lo probé. Lo malo es que cuando no hay fichero el resultado es 1, cuando hay uno pone 1 y cuando hay más de uno pone el número correcto, es cdecir, tanto si hay uno o ninguno, siempre pone 1

ZeRoberto

unread,
Feb 8, 2019, 6:32:32 AM2/8/19
to publicesvfoxpro
Como lo estas haciendo, probaste el código que te puse?

JOSE MANUEL GONZALEZ

unread,
Feb 8, 2019, 6:46:00 AM2/8/19
to publice...@googlegroups.com
El código ejecutado en un prg es el siguiente:

Dimension laArchivos [1,5] 
laArchivos = "E:\SCANNER\EXPORTAR\2019\000491"

InCant = ADIR(laArchivos, "*.pdf")

? InCant

Lo malo es que ahora solo marca 0 en todos los casos

ZeRoberto

unread,
Feb 8, 2019, 6:52:48 AM2/8/19
to publicesvfoxpro
Lo estas haciendo mal

lcMascara = "E:\SCANNER\EXPORTAR\2019\000491"

InCant = ADIR(laArchivos, lcMascara + "\*.pdf")

? InCant



JOSE MANUEL GONZALEZ

unread,
Feb 8, 2019, 7:01:38 AM2/8/19
to publice...@googlegroups.com
Perdona mi ignorancia, 
Ahora veo que si funciona.

Muchas Gracias

Jose   :-)

Rodolfo Ortiz González

unread,
Feb 8, 2019, 10:03:06 AM2/8/19
to publice...@googlegroups.com
Te paso un programa que genera lo que necesitas en una tabla, puedes ponerle el nombre que necesites, saludos!

CLEAR ALL
USE TEMPORAL IN 1 EXCLUSIVE
SELECT 1
ZAP
VRUTA=CURDIR()
    Local x, nSon, nListados 
    nListados = 0 
    Wait Window Nowait 'Genera tabla con datos fiscales de archivos PDF' 
    nSon = Adir(aArchivos, curDir()+"*.*", "D") 
    If nSon > 0 
      gnPDF = ADIR(gaPDF, '*.PDF') 
      FOR nCount = 1 TO gnPDF  
         INSERT INTO TEMPORAL (RUTA, ARCHIVO) ;
                     VALUES   (VRUTA, gaPDF(nCount,1))
      NEXT      
      nListados = nListados + 1 
    ENDIF
  
TEMPORAL.DBF

HernanCano

unread,
Feb 12, 2019, 12:07:24 AM2/12/19
to Comunidad de Visual Foxpro en Español
Jose Manuel:

El problema de tu código original está en el renglón  Dimension arreglo[1,5] .
Te explico:

En la ayuda de VFP (tengo la versión 9), se detallan los diferentes casos (cuando sí hay o no hay archivos, cuando el arreglo está creado o no está creado, etc).
Centrémosnos en el caso que te resuelve la duda:

If the array exists and ADIR( ) returns 0 because no matching files are found, the array remains unchanged. 

Si el arreglo existe y ADIR devuelve cero (porque no se encontraron archivos), el arreglo permanece no cambiado.

Teniendo en cuenta tu escenario (el código que nos muestras y nos dices que no hay archivos), hagamos la prueba de escritorio:

1. Con la instrucción Dimension arreglo[1,5] creamos el arreglo; el arreglo ya tiene una fila (y cinco columnas, pero sólo nos interesa saber que tiene una fila).
2. Intentamos buscar los .PDF que hay en el directorio en cuestión con =ADIR(arreglo,"*.PDF") 

                      Recomendación: te recomiendo reemplazar 

              SET DEFA TO ALLTRIM("E:\SCANNER\EXPORTAR\2019\"+VCODIGO100)
             =ADIR(arreglo,"*.PDF") 

                      por

             =ADIR ( arreglo, addbs("E:\SCANNER\EXPORTAR\2019\"+alltrim(VCODIGO100))+"*.PDF" )

                      De esta forma te evitas cambiar el directorio del programa.

3. Intentamos averiguar cuántos archivos se encontraron utilizando DELTA = ALEN(arreglo,1) .
   Esta instrucción nos dice cuántos renglones(filas) tiene el arreglo. 
------------------>> Hasta aquí nos llega la dicha.
Por que en el numeral 2 (de esta mi explicación) la función ADIR() --al no encontrar archivos-- deja el arreglo intacto, sin cambiarle nada a lo que tiene, que es una fila con cinco columnas ---es decir cinco elementos--- todos con valor .F., pero al fin y al cabo una fila...... que es lo que te entrega  ALEN(arreglo,1).

Te recomiendo reescribir el código que nos indicaste, más o menos como te muestro a continuación.....

HernanCano

unread,
Feb 12, 2019, 12:23:26 AM2/12/19
to Comunidad de Visual Foxpro en Español

*!* SELECT A
**USE E:\SEGISCONTA\DATOS\EMPRESAS.dbf SHARED
SELECT 0  && número cero
GO TOP in A
DO WHILE .NOT. EOF('A')
  VNOMBREMP = A.NOMBRE
VCODIGO100 = alltrim(A.CODIGO)
RUTACONTAR2 = alltrim("E:\SCANNER\EXPORTAR\2019\"+VCODIGO100)
IF DIRECTORY("&RUTACONTAR2")
    LOCAL arreglo(1)
    APPEND BLANK in B
    REPLACE CODIGO WITH VCODIGO100 in B
    REPLACE NOMBRE WITH VNOMBREMP  in B
    REPLACE TOTAL  WITH ADIR ( arreglo, addbs("E:\SCANNER\EXPORTAR\2019\"+alltrim(VCODIGO100))+"*.PDF" ) in B
ENDIF
        SKIP in A
ENDDO
SELECT B
SET FILTER TO TOTAL > 0
GO TOP

ThisForm.Grid1.Refresh


El viernes, 8 de febrero de 2019, 6:26:41 (UTC-5), JOSE MANUEL GONZALEZ escribió:
Ya lo probé. Lo malo es que cuando no hay fichero el resultado es 1, cuando hay uno pone 1 y cuando hay más de uno pone el número correcto, es cdecir, tanto si hay uno o ninguno, siempre pone 1


HernanCano

unread,
Feb 12, 2019, 12:36:08 AM2/12/19
to Comunidad de Visual Foxpro en Español
Jose:
Después de escribir el mensaje (pero antes de pasar el código modificado) hice nuevas pruebas y no encontré que pasara lo que tú mencionas (lo que inició el hilo).
Mientras escribí la respuesta no hice pruebas con "tu código" pues necesitaba un escenario muy complejo (crear un directorio, y dentro de él un subdirectorio cuyo nombre se obtiene de un DBF que se debe recorrer (con SKIP o con SCAN), luego copiar algún(os) PDF, en otra prueba borrar los PDF que hubieran ahí,...).

Por eso ZeRoberto te pidió probar primero con dos comandos.... y luego con tres (por que malentendiste lo primero que dijo).... pero no probaste.......(igual que yo--- a pesar de mi primera intervención....).....

------------------------------------
¿Dices que funciona? 
¿Con 
IF delta = 1
REPLACE TOTAL WITH 0
ELSE
REPLACE TOTAL WITH DELTA
ENDIF

o sin éso?????
Reply all
Reply to author
Forward
0 new messages