2008-11-01 5 views
8

Je crée un programme dans lequel l'utilisateur construit des répertoires (pas dans Windows, dans mon application) et dans ces dossiers il y a des sous-dossiers et ainsi de suite; Chaque dossier doit contenir des dossiers ou des documents. Quelle est la meilleure structure de données à utiliser? Notez que l'utilisateur peut sélectionner un sous-dossier et rechercher des documents dans celui-ci et dans ses sous-dossiers. Et je ne veux pas limiter les niveaux des dossiers ou des sous-dossiers.Structure de données utilisée pour la structure de répertoire?

+0

A en juger par la spécification, un dossier ne peut pas contenir un mélange de dossiers et de documents? Et vous ne pouvez pas avoir de sous-dossiers vides? Merci d'être précis. –

+0

En fait, une partie dit que les dossiers ne peuvent pas contenir un mélange; une autre partie suggère qu'ils pourraient. –

Répondre

11

C'est ce que je fais:

Chaque enregistrement dans la base de données comporte deux champs: ID et ParentID. Les ID sont composés de 4 à 5 caractères (Base36, a-z: 0-9 ou quelque chose de similaire). ID parents sont une concaténation de la structure complète du parent ...

Alors ...

Cette structure:

Root 
    Folder1 
    Folder2 
     Folder3 
    Folder4 
     Folder5 
     Folder6 

serait représentée comme ceci:

ID  ParentID  Name 

0000 NULL   ROOT 
0001 0000   Folder1 
0002 0000   Folder2 
0003 00000002  Folder3 
0004 0000   Folder4 
0005 00000004  Folder5 
0006 000000040005 Folder6 

J'aime cette structure parce que si j'ai besoin de trouver tous les fichiers sous un dossier, je peux faire une requête comme:

SELECT * FROM Folders WHERE ParentID LIKE '0000%' -- to find all folders under Folder1 

Pour supprimer un dossier et tous ses enfants:

DELETE FROM Folders WHERE ID='0004' AND ParentID LIKE '00000004%' 

Pour déplacer un dossier et ses enfants, vous devez mettre à jour tous les enregistrements qui utilisent le même parent, le nouveau parent.

Et je ne veux pas Linit les dossiers ou les niveaux de sous-dossiers

Une limitation évidente est que le nombre de sous-dossiers sont limités à la taille de votre champ ParentID.

+0

Si j'ajoute le champ "taille" pour chaque dossier/document, comment mettre à jour la taille pour tous les parents? – tuananh

8

je peux penser à quelques façons dont vous pouvez structurer, mais rien battraient l'évidence:

Utilisez le système de fichiers réel.

+0

Modifié vers le bas, mais vraiment, c'est la seule réponse saine! –

+0

Pourquoi? N'ayant pas l'intention de paraître aussi désinvolte, ma question est sincère. – iokevins

+3

que se passe-t-il si quelqu'un veut conserver un instantané dans la mémoire pour que les E/S soient minimales et uniquement pour les écritures? Quoi alors? ... L'utilisation du système de fichiers réel n'est pas une option pour les systèmes haute performance. –

5

je regarderais en utilisant une sorte de tree data structure

+0

Votre nom apparaît sur vos commentaires. Vous n'avez pas besoin de les signer. – bzlm

+0

@bzlm: Tout à fait raison. Je commençais à m'y habituer à l'époque :-) – Cameron

0

Je sais que la question demande spécifiquement pour une structure de données, mais ...

Si vous utilisez peut-être un langage orienté objet, vous pouvez utiliser la modèle de conception composite qui convient idéalement à ce type de structure arborescente hiérarchique. Vous obtenez ce que vous demandez.

0

La plupart des langages OO sont livrés avec une sorte d'abstraction pour le système de fichiers, donc là où je commencerai. Puis sous-classe si vous devez.

Je m'attendrais à des répertoires sous la forme d'un tableau d'objets qui sont des répertoires ou des fichiers, par exemple.

0

vous pouvez utiliser m-way structure de données d'arbre

+0

Cela devrait être un commentaire. –