PDA

Ver la versión completa : [Ayuda] Pistas para navegador de directorios y archivos en C.



Neodreamer
18/05/2012, 00:02
Buenas, estoy intentando hacer un navegador de archivos y carpetas sin entorno grafico, como lo fue el file commander en su dia o como son basicamente los cargadores de roms de cualquier emu, el caso es que solo he conseguido lo siguiente:
Para mostrar o listar carpetas y archivos:
system("dir /B")

Para ir a una ruta directamente:
chdir (ruta)

El problema es que no se como cambiar rutas sin teclado...solo con los botones de la consola y sin entorno grafico.
Se me ocurrio hacer lo siguiente (no se rian please que estoy empezando... y hace siglos que no programaba.)
system("dir /B") //Para verlo en pantalla
system("dir /B >> temp.txt) // para guardar temporalmente el listado de carpetas y archivos donde estoy

posteriormente, pretendo meter cada linea de ese txt, a cadenas de un array bidimensional para segun pulses arriba o abajo, con un contador o flag, saber a que linea corresponde y pasarselo como valor a chdir...

Eso es una gran chapuza?
Como se hace realmente?

Por favor, una ayuda, me gustaría ir poco a poco metiendo extras tipo copiar, pegar, cortar, etc.

Muchas gracias

p.d: Lo he puesto aqui, xq pretendo que sea para Caanoo y windows, pero sobre todo para por ejemplo, si alguien me dice, tengo unas fotos, documentos o o que sea en el pendrive que son la leche, poder pincharlo, navegar por carpetas, copiarlo a mi SD sin necesidad de un PC o similares y de paso mejorar cada vez un poco mas en esto de programacion en C.

juanvvc
18/05/2012, 01:58
Las funciones estándar para leer directorios están en dirent.h. Aquí su documentación: http://www.gnu.org/software/libc/manual/html_node/Accessing-Directories.html#Accessing-Directories

Una de las ventajas de la scene es que mucho del código es libre. Puedes mirar cualquiera del código del programa que más te guste y verás algún ejemplo de gestión de directorios. El caso más evidente son los emuladores: busca el código del emulador que más te guste y aprende.

Me costa por ejemplo que lemonboy incluye un navegador de archivos...

Neodreamer
18/05/2012, 02:01
Muchas muchas muchas gracias.... lo mirare a ver que saco y en cuanto tenga algo minimamente decente, si lo tengo, lo pongo aqui para todos.
Un saludo

hardyx
18/05/2012, 13:03
También tienes el código fuente del Selector, portado por Misato, ahí puedes ver cómo se recorre un directorio en Linux.

Neodreamer
18/05/2012, 13:06
Esta en su blog verdad?
Misato gracias adelantadas, echare un ojo.
Gracias Hardyx

Nathrezim
18/05/2012, 13:25
Las funciones estándar para leer directorios están en dirent.h. Aquí su documentación: http://www.gnu.org/software/libc/manual/html_node/Accessing-Directories.html#Accessing-Directories

Además es multiplataforma (funciona en tu PC sea el sistema operativo que sea, y en la consola), por lo que podrás depurar en tu máquina local si tienes dos targets de compilación, es decir, que el mismo código funciona en las dos plataformas.

Neodreamer
18/05/2012, 13:35
Genial, una cosa, en el codigo de Misato, he visto esto:


char *uppercase (char * cadena)
{
...
}


Que es uppercase? no lo que hace sino que es en C... porque he dado punteros, *uppercase
He dado funciones, char uppercase(paso por valor o referencia);

pero una funcion puntero? y ese asterisco suelto dentro de los argumentos?

Gracias

edit: y cuando ponen doble asterisco?

char** ReadConfig(); que tipo de funcion declara con esos asteriscos?

hardyx
18/05/2012, 14:10
Estás muy verde con el C. :) Que no te confundan los espacios en blanco. char *uppercase() es lo mismo que char* uppercase(), es decir una función que devuelve una cadena de carácteres. Mejor dicho, crea una cadena de carácteres y devuelve un puntero a su primer carácter. Vamos, una cadena de C. Y el parámetro char * cadena, es lo mismo que char* cadena, es decir un parámetro que acepta una cadena de carácteres de entrada. Es decir, un puntero al primer carácter de una cadena.

Neodreamer
18/05/2012, 14:13
Y tan verde... solo habia dado el puntero en funcion como paso por referencia en argumentos, nunca como devolucion de la propia funcion. "interesante".
Creia que solo se podia, "dato a devolver nombre_funcion(dato recibido por valor, dato recibido por referencia en *puntero);
Pero veo que hay mas opciones... jejejeje
Y lo del doble asterisco?

hardyx
18/05/2012, 14:14
char** ReadConfig() es una función que devuelve un puntero a punteros de carácteres, o lo que es lo mismo en C, un array de cadenas. Una lista de cadenas para que lo entiendas. En C los arrays son punteros. Es lo mismo poner int numeros[], que poner int *numeros;

Neodreamer
18/05/2012, 14:18
Entonces si pongo int** numeros; es lo mismo que int numeros[][]?????

hardyx
18/05/2012, 14:25
Ahí le has dado. Pero ten en cuenta que si lo pones como puntero, eres responsable de reservar memoria para ese array. Si lo haces como int numeros[10][10], es un array estático y te lo reserva el compilador. En el caso de las funciones que devuelven punteros, son las funciones las que lo reservan.

Neodreamer
18/05/2012, 14:55
oh jojojo, acabas de abrirme los ojos a mi y a mi profesor (creo) porque cada ejercicio que haciamos de arrays o cadenas, siempre reservaba un valor fijo e incluso lo ponia como define y yo le decia que para eso era mejor cuando jugabamos con bucles y tal, poner el array como puntero y luego averiguar con strlen el maximo que media para jugar con el bucle for o while, etc...
Odio los punteros, pero cada vez le voy viendo mas utilidad ;)
Gracias

P.D: tambien estoy con ensamblador(empezando totalmente, mas en segundo) para pics en este ciclo superior de electronica, por si quereis ayudarme jejejejeje

hardyx
18/05/2012, 19:21
Está bien poner una longitud fija en los arrays hasta que no sepas manejar bien la memoria dinámica, porque si estás aprendiendo y te metes con memoria dinámica vas a flipar en colores. Aún así, no puedes usar char *p para guardar una cadena sin asignarle memoria primero (con malloc o new), o apuntar a algo ya asignado.

Neodreamer
18/05/2012, 22:34
Gracias, justo hoy hemos empezado eso en clase con las pilas, memoria dinamica, etc.
A ver si le voy cogiendo el tranquillo. Nos queda solo este tema, el de ficheros y ya despues programacion pic con Ansi C. (Aparte de lo que ya estanis dando en ensamblador)