2008-11-01 30 views
8

Estoy creando un programa en el que el usuario compila directorios (no en Windows, en mi aplicación) y en estas carpetas hay subcarpetas y demás; 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 o los niveles de las subcarpetas.Estructura de datos utilizada para la estructura de directorios?

+0

A juzgar por la especificación, una carpeta no puede contener una mezcla de carpetas y documentos? ¿Y no puedes tener subcarpetas vacías? Por favor sea preciso. –

+0

En realidad, una parte dice que las carpetas pueden no contener una mezcla; otra parte sugiere que podrían. –

Respuesta

11

Esto es lo que hago:

cada registro de la base de datos tiene dos campos: ID y ParentID. Los ID son de 4 a 5 caracteres (Base36, a-z: 0-9 o algo similar). IDs de padres son una concatenación de estructura completa del padre ...

Entonces ...

Esta estructura:

Root 
    Folder1 
    Folder2 
     Folder3 
    Folder4 
     Folder5 
     Folder6 

se representaría así:

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 hijos, usted tiene que actualizar todos los registros que utilizan el mismo padre, a la nueva matriz.

Y yo no quiero LINIT las carpetas o los niveles de subcarpetas

Una limitación obvia de esto es que el número de subcarpetas están limitados al tamaño de su campo ParentID.

+0

Si agrego el campo "tamaño" para cada carpeta/documento, ¿cómo actualizar el tamaño para todos los padres? – tuananh

8

puedo pensar en algunas maneras en que podría estructurar esto, pero nada podría superar lo obvio:

utilizar el sistema de archivo real.

+0

Modificado, pero en realidad, ¡esta es la única respuesta correcta! –

+0

¿Por qué? Sin pretender parecer frívolo, mi pregunta es sincera. – iokevins

+3

¿Qué sucede si alguien quiere mantener una instantánea en la memoria para que IO sea mínima y solo para escrituras? Entonces que ? ... Usar el sistema de archivos actual no es una opción para sistemas de alto rendimiento. –

5

Me gustaría ver en el uso de algún tipo de tree data structure

+0

Su nombre aparece en sus comentarios. No necesita firmarlos. – bzlm

+0

@bzlm: Absolutamente correcto. Me estaba acostumbrando a SO en aquel entonces :-) – Cameron

0

Sé que la pregunta está pidiendo específicamente para una estructura de datos, pero ...

Si está utilizando un lenguaje orientado a objetos tal vez usted puede utilizar el patrón de diseño compuesto que es ideal para este tipo de estructura similar a un árbol jerárquico. Obtienes lo que estás pidiendo.

0

La mayoría de los lenguajes OO vienen con algún tipo de abstracción para el sistema de archivos, por lo que es allí donde comenzaría. Luego subclases si es necesario.

Me gustaría contar con directorios como una matriz de objetos que son directorios o archivos, por ejemplo.

0

puede utilizar m-forma la estructura de datos de árbol

+0

Esto debería ser un comentario. –

Cuestiones relacionadas