he intentado con varias combinaciones pero nada resulta.
necesito que el programa me devuelva los nombres de los archivos que se encuentran en un directorio, y de ser posible también el nombre de las carpetas de ese directorio y el de los archivos de estas carpetas.
algunas sugerencias?
como indico al programa para que me de los nombres de los archivos que se encuentran en una carpeta, para ser mas especifico
[gml]files = 0;
file[files] = file_find_first("el\directorio\que\sea\*", 0);
while (file[files] != "") {
files += 1;
file[files] = file_find_next();
}[/gml]
Eso te deja con un array "file" con el nombre de cada archivo y directorio, y una variable "files" con la cantidad de items en el array. Si querés buscar también en los directorios dentro del directorio, tendrías que ponerlo en una función y hacer que se ejecute recursivamente...
Pues esté seria el script para añadir todos los archivos dentro de una carpeta a una mapa.
[gml]
//Id del mapa
file=ds_map_create();
//Variable que almacena el numero de archivos
files = 0;
//Array para almacenar las direcciones de todas las carpetas.
folder[0]="";
//directorio inicial.
directory=get_directory('')+"\";
//Variable que almacena el numero de carpetas
folders=0;
//Carpeta actual, en la que se están revisando los archivos.
aFolder=0;
//variable que almacena el nombre del archivo actualmente revizado.
a=file_find_first(directory+'\'+folder[aFolder]+'\*', fa_directory);
ds_map_add(file, a, 0);
while (true) {
files += 1;
ds_map_add(file, a, 0);
if directory_exists(directory+'\'+folder[aFolder]+'\'+a+'\'){
files-=1;
//Existen dos directorios invicibles para el explorador estos son "." y ".." indican la ruta de carpetas anteriores.
//ya que estas carpetas son inecesarias no las añadimos.
if ( a!="." && a!=".." ){
folders+=1;
folder[folders]=folder[aFolder]+'\'+a;
}
}
//Busca el siguiente archivo
a=file_find_next();
if ( a=="" ){
if ( folders==aFolder ) break;
aFolder+=1;
a=file_find_first(directory+'\'+folder[aFolder]+'\*', fa_directory);
}
}
[/gml]
Como dato curioso el script tarda 16,000ms en buscar 11,000 archivos pero si eliminamos la linea en la que se añade cada archivo al mapa se tarda 700ms, eso solo demuestra lo increíblemente lento es crear nuevos elementos en estructuras de datos en gm.
Por cierto puedes hacer que en lugar de añadirse a un mapa se añadan a un array, eso lo haría mas rápido, el problema es que los arrays solo pueden almacenar 32,000 valores.
P.D: con esto se podría hacer un buscador con todos los archivos previamente indexados y con un buen algoritmo de búsqueda basada en un diccionario podría hacerse un script que encuentre un archivo en menos de un segundo parecido a Evertything (http://www.voidtools.com/).
Cita de: brunoxzx en Enero 15, 2013, 03:06:31 AM
Por cierto puedes hacer que en lugar de añadirse a un mapa se añadan a un array, eso lo haría mas rápido, el problema es que los arrays solo pueden almacenar 32,000 valores.
Saludos:
Corrección: Un "array" solo admite hasta 32000 en cada índice, pero el valor total de espacios no puede superar el 1000000 (millón), o sea 1000 por cada uno al unísono. XD
Cita de: ferhand en Enero 15, 2013, 07:22:17 PM
Cita de: brunoxzx en Enero 15, 2013, 03:06:31 AM
Por cierto puedes hacer que en lugar de añadirse a un mapa se añadan a un array, eso lo haría mas rápido, el problema es que los arrays solo pueden almacenar 32,000 valores.
Saludos:
Corrección: Un "array" solo admite hasta 32000 en cada índice, pero el valor total de espacios no puede superar el 1000000 (millón), o sea 1000 por cada uno al unísono. XD
Wow leyendo lo que dices me fui al manual y sí el manual dice exactamente lo que tu dices, y estaba por postear aquí pero mientras escribía me dí cuenta de que no entedia muy bien lo del limite del millon así que me puse a experimentar y según los resultados no existe limite de un millon, los únicos limites existentes en gm, aparentemente son que no puede haber mas de 32000 indices por dimensión y tu memoria ram.
Use esté código para ver cuando era que gm me daba un error
[gml]array[31999, 31999]=0;
for(i=0; i<31999; i+=1){
for(j=0; j<31999; j+=1){
array[i, j]=$ffffffff;
}
screen_redraw();
draw_text(0, 0, i);
screen_refresh();
}[/gml]
Para mi sorpresa gm nunca dio error alguno y mientras el contador subía el uso de memoria ram también cuando "i" hiba por el 1300(esto es 1300*32000 indices ya que es un array bidimencional) el array ya había ocupado mas de un gigabyte de ram :o y gm no me mando ningún mensaje de error lo deje funcionando hasta que me quedaban como 200 megas de ram no fue mucho tiempo ya que no tengo mucha ram.
Aunque esto no me deja clara una cosa, si cada indice es de 32bits esto es 4 bytes y se hacen 32000 indices de j por cada uno de i, esto es 128,000 bytes por cada indice de i, entonces 1000 indices son 128,000 kb que es igual a 128mb y eso no está ni cerca de un gigabyte, quizás no entiendo muy bien esto de los arrays o es que no son 4 bytes por indice, no lo sé quizás alguien aquí tenga la respuesta. Por cierto use gm8 para las pruebas.
Cita de: brunoxzx en Enero 15, 2013, 11:36:43 PM
Aunque esto no me deja clara una cosa, si cada indice es de 32bits esto es 4 bytes y se hacen 32000 indices de j por cada uno de i, esto es 128,000 bytes por cada indice de i, entonces 1000 indices son 128,000 kb que es igual a 128mb y eso no está ni cerca de un gigabyte, quizás no entiendo muy bien esto de los arrays o es que no son 4 bytes por indice, no lo sé quizás alguien aquí tenga la respuesta. Por cierto use gm8 para las pruebas.
El problema radica que la cantidad de celdas en un "array" bidimensional es la multiplicación de las columnas por las filas.
Por lo que 1000 indices en (i) y 1000 indices en (j) dan como resultado 1000000 (un millón) de espacios para datos. 1000000 * 128,000 bytes = haz la matemática... XD XD
si si eso hice 1000 indices en I y 32,000 en J por cada uno de i esto es 1000*32000=32,000,000 indices en total siendo estos 4 bytes por indice son 128,000,000 de bytes que son iguales a 128,000 kb y 128mb, no?