- Necesito escribir una función que cuando se le da la ruta de una carpeta escanea los archivos enraizados en esa carpeta.
- Y luego necesito mostrar la estructura del directorio en esa carpeta.
Sé cómo hacer 2 (voy a usar jstree para mostrarlo en el navegador).
Respuestas:
EDITAR : Suficiente gente todavía ha dado con esta respuesta, que pensé en actualizarla para la API Go1. Este es un ejemplo funcional de filepath.Walk () . El original está debajo.
Tenga en cuenta que filepath.Walk recorre el árbol de directorios de forma recursiva.
Esta es una ejecución de ejemplo:
SIGUE LA RESPUESTA ORIGINAL: La interfaz para rutas de archivos móviles ha cambiado semanalmente desde el 16 de septiembre de 2011, consulte http://groups.google.com/group/golang-nuts/msg/e304dd9cf196a218 . El siguiente código no funcionará para las versiones de lanzamiento de GO en un futuro próximo.
En realidad, hay una función en la biblioteca estándar solo para esto: filepath.Walk .
fuente
filepath.Walk
no sigue enlaces simbólicos por cierto.filepath.Walk
devolución de llamada de @FrancescoPasa se activará en los enlaces simbólicos (tanto el archivo como el directorio). Sí, no los seguirá , pero la devolución de llamada reconocerá un enlace simbólico y tomará medidas adicionales, es decir, un seguimiento,filepath.Walk
asegurándose primero de que la ruta aún no se haya visitado.He aquí una forma de obtener información de archivo para los archivos en un directorio.
fuente
Readdir
parámetro del método esn
unint
. Sin <= 0
,Readdir
devuelve todo elFileInfo
del directorio en un solo segmento.os
func (FileMode) IsRegular
.Aquí hay un ejemplo para recorrer todos los archivos y directorios de forma recursiva. Tenga en cuenta que si desea saber si la ruta que está agregando es un directorio, simplemente marque "f.IsDir ()".
fuente
main
método no debería tener([]string, error)
argumentos y necesitas hacer algo conerr
. ¿A menos que al momento de contestar fuera válido? Definitivamente un error de compilación en versiones más recientes. De lo contrario, muy útil, gracias.El paquete
github.com/kr/fs
proporciona unaWalker
API muy interesante.fuente
El paquete estándar Go
ioutil
tiene una función incorporada para este caso, vea el ejemplo a continuaciónfuente
Tenga en cuenta que "Walk no sigue enlaces simbólicos", por lo que si está buscando escribir una función que lo haga, le recomiendo ioutil.ReadDir . Mi propia prueba comparativa mostró que es más rápido y requiere menos memoria que filepath.Glob .
Además,
ioutil.ReadDir
ordena los archivos por nombre de base mediante la comparación de cadenas básica (strA > strB
). Como usuario de devops, generalmente clasifico los nombres de los directorios haciendo una comparación numérica inversa (la última compilación primero, por ejemplo). Si ese también es su caso, entonces es mejor llamar directamente a os.ReadDir (ioutil.ReadDir
está llamando a esto bajo las sábanas) y hacer la clasificación usted mismo.A continuación, se muestra un ejemplo de la
ReadDir
pieza con ordenación numérica:fuente
Es posible que desee realizar funciones de búsqueda aquí, de modo que pueda utilizar completamente la búsqueda
fuente