¿Estructura de datos utilizada para la estructura de directorios?
-
05-07-2019 - |
Pregunta
Estoy creando un programa que el usuario crea directorios (no en Windows, en mi aplicación) y en estas carpetas hay subcarpetas, etc. Cada carpeta debe contener carpetas o documentos. ¿Cuál es la mejor estructura de datos para usar? Tenga en cuenta que el usuario puede seleccionar una subcarpeta y buscar documentos en ella y en sus subcarpetas. Y no quiero limitar las carpetas ni los niveles de las subcarpetas.
Solución
Esto es lo que hago:
Cada registro en la base de datos tiene dos campos: ID y ParentID. Los ID son 4-5 caracteres (Base36, a-z: 0-9 o algo similar). Los ID de los padres son una concatenación de la estructura completa de los padres ...
Entonces ...
Esta estructura:
Root
Folder1
Folder2
Folder3
Folder4
Folder5
Folder6
Estaría representado de esta manera:
ID ParentID Name
0000 NULL ROOT
0001 0000 Folder1
0002 0000 Folder2
0003 00000002 Folder3
0004 0000 Folder4
0005 00000004 Folder5
0006 000000040005 Folder6
Me gusta esta estructura porque si necesito encontrar todos los archivos en una carpeta, puedo hacer una consulta como:
SELECT * FROM Folders WHERE ParentID LIKE '0000%' -- to find all folders under Folder1
Para eliminar una carpeta y todos sus hijos:
DELETE FROM Folders WHERE ID='0004' AND ParentID LIKE '00000004%'
Para mover una carpeta y sus elementos secundarios, debe actualizar todos los registros que utilizan el mismo elemento principal al nuevo elemento principal.
Y no quiero alinear las carpetas o los niveles de las subcarpetas
Una limitación obvia para esto es que el número de subcarpetas está limitado al tamaño de su campo ParentID.
Otros consejos
Puedo pensar en algunas formas en que podrías estructurar esto, pero nada superaría lo obvio:
Utilice el sistema de archivos real.
Me gustaría usar algún tipo de estructura de datos del árbol
Debería recomendar B + Tree .... Puedes usar fácilmente la indexación (página, carpeta, etc.) y todo.
B + Tree http://commons.wikimedia.org/wiki/File:Btree .png
para más información: http://ozark.hendrix.edu/~burch/ cs / 340 / reading / btree / index.html
Sé que la pregunta está pidiendo específicamente una estructura de datos pero ...
Si está utilizando un lenguaje orientado a objetos, tal vez pueda usar el patrón de diseño compuesto que es ideal para este tipo de estructura jerárquica de árbol. Obtienes lo que estás pidiendo.
La mayoría de los lenguajes OO vienen con algún tipo de abstracción para el sistema de archivos, así que ahí es donde empezaría. Luego subclase si es necesario.
Espero que los directorios sean una matriz de objetos que son directorios o archivos, por ejemplo.
puede utilizar la estructura de datos del árbol m-way