Levantar archivos por extensión

3 views
Skip to first unread message

Luciano Dzisiuk

unread,
Oct 8, 2010, 12:00:06 PM10/8/10
to C Talks
Buenas buenas!
Queria saber si existe una forma para abrir un archivo sin saber su
nombre pero si su extensión (por ejemplo .txt).
Intenté con :

char* pathArchivo= "..\\carpetaConTXT\\*.txt";

ifstream myStream(pathArchivo);

pero no pasa naranja, también intenté con el path absoluto (que no
seria lo ideal).

En el cmd si ejecuto "more ..\carpetaConTXT\*.txt" me muestra los txt
que tenga ahí (windows).

Y ya que estamos, queria saber si llegado el caso en que pueda
levantar todos los .txt de esa carpeta, como me los organiza en el
stream? me los separa o algo para identificar CUANTOS archivos habia?

Muchísimas gracias!!!

Facundo Viale

unread,
Oct 8, 2010, 1:30:06 PM10/8/10
to c-t...@googlegroups.com
Buenas Luciano, lo que vos preguntas no se puede XD

Lo que podes haces es listar los archivos de un directorio, a lo cual poder revisar uno x uno cual es su extensión y saber si lo tenes que leer o no. De hecho lo mas probable es que el comando que estas ejecutando haga justamente esto y use el * como un comodín para la búsqueda.

Saludos!


--
Recibiste este mensaje porque estás suscrito al Grupo "C Talks".
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a c-t...@googlegroups.com
Para anular la suscripción a este grupo, envía un mensaje a
c-talks+u...@googlegroups.com
Para obtener más opciones, visita este grupo en
http://groups.google.com.ar/group/c-talks?hl=es.

Luciano Dzisiuk

unread,
Oct 8, 2010, 3:04:15 PM10/8/10
to C Talks
Buenísimo! voy a buscar esa funcion entonces!

Muchas gracias! Saludos.

On 8 oct, 14:30, Facundo Viale <facundo.m.vi...@gmail.com> wrote:
> Buenas Luciano, lo que vos preguntas no se puede XD
>
> Lo que podes haces es listar los archivos de un directorio, a lo cual poder
> revisar uno x uno cual es su extensión y saber si lo tenes que leer o no. De
> hecho lo mas probable es que el comando que estas ejecutando haga justamente
> esto y use el * como un comodín para la búsqueda.
>
> Saludos!
>
> El 8 de octubre de 2010 13:00, Luciano Dzisiuk
> <dzisiukluci...@gmail.com>escribió:
>
> > Buenas buenas!
> > Queria saber si existe una forma para abrir un archivo sin saber su
> > nombre pero si su extensión (por ejemplo .txt).
> > Intenté con :
>
> >        char* pathArchivo= "..\\carpetaConTXT\\*.txt";
>
> >        ifstream myStream(pathArchivo);
>
> > pero no pasa naranja, también intenté con el path absoluto (que no
> > seria lo ideal).
>
> > En el cmd si ejecuto "more ..\carpetaConTXT\*.txt" me muestra los txt
> > que tenga ahí (windows).
>
> > Y ya que estamos, queria saber si llegado el caso en que pueda
> > levantar todos los .txt de esa carpeta, como me los organiza en el
> > stream? me los separa o algo para identificar CUANTOS archivos habia?
>
> > Muchísimas gracias!!!
>
> > --
> > Recibiste este mensaje porque estás suscrito al Grupo "C Talks".
> > Si quieres publicar en este grupo, envía un mensaje de correo
> > electrónico a c-t...@googlegroups.com
> > Para anular la suscripción a este grupo, envía un mensaje a
> > c-talks+u...@googlegroups.com<c-talks%2Bunsu...@googlegroups.com>

Matías Dumrauf

unread,
Oct 8, 2010, 3:05:56 PM10/8/10
to c-t...@googlegroups.com
Exacto. De echo, lo que se hace en Windows es utilizar un HANDLE que es un puntero al primer elemento del directorio que se quiere revisar, y un LPWIN32_FIND_DATAA para iterar elemento por elemento.

Lo que se hace entonces es recorrer ese directorio, cargando la estructura LPWIN32_FIND_DATAA con el elemento iterado. Luego se consultan sus atributos (por si es un archivo u otro directorio) y se hace algo en consecuencia (ej. obtenerle el hash, detalles como nombre, tamaño, timestamp, etc.)

Un ejemplo en código:

    LPWIN32_FIND_DATAA file;
    HANDLE handleFind;
    char *path = "./*"

    file = (LPWIN32_FIND_DATAA) malloc(sizeof(WIN32_FIND_DATAA));
 
    handleFind = FindFirstFileA((LPCSTR)directory,file);
 
    if (handleFind == INVALID_HANDLE_VALUE) {
        ree(file);
        return -1;
    }
 
    do{
        if(file->dwFileAttributes != 33){
            if (file->dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) {
                // Hacer algo con el file.
            }
        }
        free(file);
        file = (LPWIN32_FIND_DATAA) malloc(sizeof(WIN32_FIND_DATAA));
    }while(FindNextFileA(handleFind,file));
 
    if (GetLastError() != ERROR_NO_MORE_FILES){
        free(file);
        return -1;
    }
    free(file);
    FindClose(handleFind);


Más info:
File Attributes: http://msdn.microsoft.com/en-us/library/gg258117%28v=VS.85%29.aspx
FindFirstFile: http://msdn.microsoft.com/en-us/library/aa364418%28VS.85%29.aspx
Listint the files in a Directory: http://msdn.microsoft.com/en-us/library/aa365200%28v=VS.85%29.aspx


Saludos, y espero que te sirva de puntapié inicial. Cualquier cosa nos decís.

Matías Dumrauf

Luciano Dzisiuk

unread,
Oct 8, 2010, 3:28:51 PM10/8/10
to C Talks
Muchas gracias por la info y por la onda!!!


On 8 oct, 16:05, Matías Dumrauf <matias.dumr...@gmail.com> wrote:
> Exacto. De echo, lo que se hace en Windows es utilizar un HANDLE que es un
> puntero al primer *elemento* del directorio que se quiere revisar, y un
> LPWIN32_FIND_DATAA para iterar elemento por elemento.
>
> Lo que se hace entonces es recorrer ese directorio, cargando la estructura
> LPWIN32_FIND_DATAA con el elemento iterado. Luego se consultan sus atributos
> (por si es un archivo u otro directorio) y se hace algo en consecuencia (ej.
> obtenerle el hash, detalles como nombre, tamaño, timestamp, etc.)
>
> Un ejemplo en código:
>
>     LPWIN32_FIND_DATAA file;
>     HANDLE handleFind;
>     char *path = *"./*"
>
> *    file = (LPWIN32_FIND_DATAA) malloc(sizeof(WIN32_FIND_DATAA));
>
>     handleFind = FindFirstFileA((LPCSTR)directory,file);
>
>     if (handleFind == INVALID_HANDLE_VALUE) {
>         ree(file);
>         return -1;
>     }
>
>     do{
>         if(file->dwFileAttributes != 33){
>             if (file->dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) {
>              *   // Hacer algo con el file.*
>             }
>         }
>         free(file);
>         file = (LPWIN32_FIND_DATAA) malloc(sizeof(WIN32_FIND_DATAA));
>     }while(FindNextFileA(handleFind,file));
>
>     if (GetLastError() != ERROR_NO_MORE_FILES){
>         free(file);
>         return -1;
>     }
>     free(file);
>     FindClose(handleFind);
>
> *Más info*:
> File Attributes:http://msdn.microsoft.com/en-us/library/gg258117%28v=VS.85%29.aspx
> FindFirstFile:http://msdn.microsoft.com/en-us/library/aa364418%28VS.85%29.aspx
> Listint the files in a Directory:http://msdn.microsoft.com/en-us/library/aa365200%28v=VS.85%29.aspx
>
> Saludos, y espero que te sirva de puntapié inicial. Cualquier cosa nos
> decís.
>
> Matías Dumrauf
>
> El 8 de octubre de 2010 14:30, Facundo Viale
> <facundo.m.vi...@gmail.com>escribió:
>
> > Buenas Luciano, lo que vos preguntas no se puede XD
>
> > Lo que podes haces es listar los archivos de un directorio, a lo cual poder
> > revisar uno x uno cual es su extensión y saber si lo tenes que leer o no. De
> > hecho lo mas probable es que el comando que estas ejecutando haga justamente
> > esto y use el * como un comodín para la búsqueda.
>
> > Saludos!
>
> > El 8 de octubre de 2010 13:00, Luciano Dzisiuk <dzisiukluci...@gmail.com>escribió:
>
> > Buenas buenas!
> >> Queria saber si existe una forma para abrir un archivo sin saber su
> >> nombre pero si su extensión (por ejemplo .txt).
> >> Intenté con :
>
> >>        char* pathArchivo= "..\\carpetaConTXT\\*.txt";
>
> >>        ifstream myStream(pathArchivo);
>
> >> pero no pasa naranja, también intenté con el path absoluto (que no
> >> seria lo ideal).
>
> >> En el cmd si ejecuto "more ..\carpetaConTXT\*.txt" me muestra los txt
> >> que tenga ahí (windows).
>
> >> Y ya que estamos, queria saber si llegado el caso en que pueda
> >> levantar todos los .txt de esa carpeta, como me los organiza en el
> >> stream? me los separa o algo para identificar CUANTOS archivos habia?
>
> >> Muchísimas gracias!!!
>
> >> --
> >> Recibiste este mensaje porque estás suscrito al Grupo "C Talks".
> >> Si quieres publicar en este grupo, envía un mensaje de correo
> >> electrónico a c-t...@googlegroups.com
> >> Para anular la suscripción a este grupo, envía un mensaje a
> >> c-talks+u...@googlegroups.com<c-talks%2Bunsu...@googlegroups.com>
> >> Para obtener más opciones, visita este grupo en
> >>http://groups.google.com.ar/group/c-talks?hl=es.
>
> >  --
> > Recibiste este mensaje porque estás suscrito al Grupo "C Talks".
> > Si quieres publicar en este grupo, envía un mensaje de correo
> > electrónico a c-t...@googlegroups.com
> > Para anular la suscripción a este grupo, envía un mensaje a
> > c-talks+u...@googlegroups.com<c-talks%2Bunsu...@googlegroups.com>

Luciano Dzisiuk

unread,
Oct 15, 2010, 3:16:45 PM10/15/10
to C Talks
Te hago una preguntita...
qué es el atributo de archivo 33?

en esta pag no está
http://msdn.microsoft.com/en-us/library/gg258117%28v=VS.85%29.aspx

y en mi código tuve problemas preguntando que sea distinto de 33, asi
que no hice esa validación.

Gracias! Saludos!

Matías Dumrauf

unread,
Oct 18, 2010, 1:01:45 AM10/18/10
to c-t...@googlegroups.com
33 sería una combinación de dos atributos. En MSDN no está explicado, directamente te tira el ejemplo para que lo pruebes.

Si miramos los atributos:

FILE_ATTRIBUTE_READONLY                                1 (0x1)
A file that is read-only.
FILE_ATTRIBUTE_ARCHIVE                                  32 (0x20)
A file or directory that is an archive file or directory. Applications typically use this attribute to mark files for backup or removal.

33 sería el valor de tomar ambas constantes. De esta manera, se consulta por que sea distinto de FILE_ATTRIBUTE_ARCHIVE (32) y distinto de FILE_ATTRIBUTE_ARCHIVE (1) al mismo tiempo. Ésto quiere decir, justamente, que es un HANDLE común y corriente, sin importar su extensión si es un archivo o si es un directorio. Luego se pregunta por distinto de FILE_ATTRIBUTE_DIRECTORY para validar que no sea un directorio.


Más info de las constantes de atributos: http://msdn.microsoft.com/en-us/library/gg258117

Saludos,

Mati
Reply all
Reply to author
Forward
0 new messages