Inicio
Buscar
Ingresar
Registrarse
Starfield: el juego que revolucionará el espacio y la tecnología
Hack x Crack - Comunidad de Seguridad informática
»
Programación
»
C / C++
»
ayuda con funcion para listar directorio
Imprimir
Páginas: [
1
]
Ir Abajo
Autor
Tema: ayuda con funcion para listar directorio (Leído 4043 veces)
INQUISIDOR
{ L0 } Ñuub
Mensajes: 15
ayuda con funcion para listar directorio
«
en:
Abril 01, 2015, 01:15:37 am »
Hola a tod@s.
estos dias en el cual tengo tiempo libre decidi hacer una funcion que me retorne el nombre de todos los archivos y carpetas de un directorio en windows, pues ya logre mediante una lista enlazada simple guardar el nombre de los archivos y carpetas, pero el problema que resulta es que quiero hacer que la funcion me devuelva un puntero de tipo char donde se encuentra guardada la lista con los nombres pero de hay no paso, me sale un error con strcpy() que esta antes de acabar la funcion listardirectorio. este es el codigo que llevo hasta el momento.
Código: C
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>
//estructura para la lista enlazada simple
struct
lista_simple
{
char
lista_archivo
[
50
]
[
MAX_PATH
]
;
struct
lista_simple
*
siguiente
;
}
;
char
**
listarDirectorio
(
char
*
ruta
)
{
WIN32_FIND_DATA findFileData
;
HANDLE hFind
;
strcat
(
ruta
,
"*"
)
;
//cocatenamos para que la funcion FindFirstFile() me muestre todos los archivos
//declaramos las listas simples
struct
lista_simple
*
dir
=
(
struct
lista_simple
*
)
malloc
(
sizeof
(
struct
lista_simple
)
)
;
//variable encargada de giar la lista
if
(
dir
==
NULL
)
{
printf
(
"Falta memoria.
\n
"
)
;
return
NULL
;
}
dir
->
siguiente
=
NULL
;
//final de la lista encadenada simple
struct
lista_simple
*
primero
=
(
struct
lista_simple
*
)
NULL
;
struct
lista_simple
*
ultimo
=
(
struct
lista_simple
*
)
NULL
;
hFind
=
FindFirstFile
(
ruta
,
&
findFileData
)
;
//solicitamos el primer archivo
int
cant_arch
=
1
;
//1 por mas adelante por si hay un solo archivo
if
(
hFind
==
INVALID_HANDLE_VALUE
)
{
//si hay algun error abortamos
printf
(
"Error, valor de hFind es INVALID_HANDLE_VALUE.
\n
"
)
;
return
NULL
;
}
else
{
int
i
,
estatus
;
do
{
i
=
0
;
strcpy
(
dir
->
lista_archivo
[
i
]
,
findFileData.
cFileName
)
;
//El nombre de la ultamo archivo consultado
estatus
=
FindNextFile
(
hFind
,
&
findFileData
)
;
for
(
i
=
1
;
(
estatus
!=
0
)
&&
(
i
!=
50
)
;
i
++
)
{
//verificamos que la funcion FindNextFile() no retorne 0 y que i se pase de 50 para evitar desbordamiento
strcpy
(
dir
->
lista_archivo
[
i
]
,
findFileData.
cFileName
)
;
estatus
=
FindNextFile
(
hFind
,
&
findFileData
)
;
}
cant_arch
+=
i
;
//cantidad de normbres encontrados
if
(
estatus
==
0
)
{
//revisa que no hay que seguir buscando nombres
if
(
primero
==
NULL
)
{
//en caso de que halla 50 o menos nombres de archivos y carpetas
primero
=
dir
;
ultimo
=
dir
;
}
break
;
}
if
(
primero
==
NULL
)
{
//si solo ha pasado 1 vez guardamos posicion
primero
=
dir
;
ultimo
=
dir
;
}
else
{
//si ya ha pasado varias veces guardamos posicion para perdela
ultimo
->
siguiente
=
dir
;
ultimo
=
dir
;
}
dir
=
(
struct
lista_simple
*
)
malloc
(
sizeof
(
struct
lista_simple
)
)
;
//reservamos memoria para la siguiente estructura
if
(
dir
==
NULL
)
return
NULL
;
dir
->
siguiente
=
NULL
;
}
while
(
1
)
;
}
FindClose
(
hFind
)
;
//se cierra el handler segun la documentacion de microsoft
//organizamos para retornar un 'char*'
struct
lista_simple
*
auxiliar
=
primero
;
struct
lista_simple
*
auxiliar2
=
NULL
;
char
(
*
lista_archivos
)
[
MAX_PATH
]
=
(
char
(
*
)
[
MAX_PATH
]
)
malloc
(
MAX_PATH
*
sizeof
(
char
)
)
;
//se declara un array con la cantidad de nombres encontrados
int
i
=
0
;
printf
(
"Muestra del primer elemento de auxiliar: %s
\n
\n
"
,
auxiliar
->
lista_archivo
[
0
]
)
;
printf
(
"Muestra del segundo elemento de auxiliar: %s
\n
\n
"
,
auxiliar
->
lista_archivo
[
1
]
)
;
while
(
(
auxiliar
!=
NULL
)
&&
(
i
<=
cant_arch
)
)
{
//primer ciclo para recorrer la lista
int
x
;
for
(
x
=
0
;
x
<=
50
&&
(
i
<=
cant_arch
)
;
x
++
)
{
//segundo ciclo para recorrer la estructura y guardar los nombre
strcpy
(
lista_archivos
[
i
]
,
auxiliar
->
lista_archivo
[
x
]
)
;
//<===== ERROR
i
++;
}
//i += x;
auxiliar2
=
auxiliar
;
auxiliar
=
auxiliar
->
siguiente
;
free
(
auxiliar2
)
;
//liberamos la memoria una vez que se copia el nombre a la nueva variable
}
lista_archivos
[
cant_arch
+
1
]
[
0
]
=
'
\0
'
;
return
lista_archivos
;
}
int
main
(
)
{
char
dir
[
MAX_PATH
]
;
printf
(
"Introdusca directorio: "
)
;
scanf
(
"%s"
,
dir
)
;
char
**
listado
=
listarDirectorio
(
dir
)
;
printf
(
"Listado del directorio principal:
\n
\n
"
)
;
int
i
;
for
(
i
=
0
;
listado
[
i
]
[
0
]
!=
'
\0
'
;
i
++
)
{
printf
(
"%s
\n
"
,
listado
[
i
]
)
;
}
getch
(
)
;
return
0
;
}
En línea
Villano
{ L2 } Nativo Digital
Mensajes: 126
Re:ayuda con funcion para listar directorio
«
Respuesta #1 en:
Abril 01, 2015, 03:22:22 am »
1) Intenta ser mas ordenado. Es decir declaración de variables por un lado y cuando las manejas por otro. NO uses bucles infinitos son peligrosos y hay que ir pescando a ver cual es la condición de salida.
2) El problema que tenes es en la reserva de memoria dinamica. Creo que lo tenes que hacer del siguiente modo.
.1 declarar el doble puntero
.2 reservar memoria de x
(numero de directorios, archivos,etc en este caso)
punteros para el doble puntero
.3 para cada puntero de recien reservar maxpath (este se hace con un for)
3) esto se puede hacer de otra forma que es:
.1 contar los archivos y directorios
.2 reservar memoria
.3 guardar los archivos en la memoria reservada
En línea
Imprimir
Páginas: [
1
]
Ir Arriba
Hack x Crack - Comunidad de Seguridad informática
»
Programación
»
C / C++
»
ayuda con funcion para listar directorio
Va un mudo y le dice a un sordo: Hack x Crack usa cookies. Pues eso...
OK
Learn more