2016-06-28 2 views
0

Я работаю над программой, которая содержит такой каталог (основные каталоги и каждый каталог содержат подкаталоги и каждый подкаталог содержат каталоги под2 и т. Д. ... до окончательного каталога содержит файлы .doc как объекты) Пример:. enter image description hereФайлы и каталоги внутри базы данных доступа

Как я могу спроектировать базу данных, чтобы принять это дерево иерархии, то я могу получить каждый каталоги и открывать любые .doc в моей C# программы.

Я новичок в использовании дерева и базы данных.

Благодаря

Edit:

У меня есть 7 основных папок, и каждая папка имеет ряд вложенных папок и могут быть некоторые суб-folders1 есть еще один суб-folders2, которые содержат файлы, другие суб -folders1 есть файлы тоже. (Всего файлов почти 10000).

ВОПРОС:

Как я заполнить эту структуру в базу данных, то я могу перечислить их в TreeView или ListBox?

Благодаря

ответ

1

Вы можете использовать неограниченную бесконечную структуру с одной таблицей. Я буду использовать MS SQL здесь. Но такая же логика применима и к MS Access.

enter image description here

Идентификатор является уникальным идентификатором строки. ParentId является ссылкой на Id, где эта строка будет отображаться под. Другими словами, родитель текущей строки. Имя - это поле для указания каталога или имени файла. IsFile (может быть опущен) - это определить, является ли это файлом или каталогом. Фактически вы можете применить некоторую логику в коде, чтобы проверить, есть ли в строке какие-либо дети. Если есть дети этой строки, вы можете просто пометить ее как каталог.

Тогда мы можем заполнить эту таблицу с некоторыми данными

enter image description here

Если вы используете MS SQL Server 2005 и в последующие годы, можно было бы просто создать КТР (Common Таблица Expression) для автоматического выполнения всего дерева , Но Access не поддерживает общие выражения таблиц.

Как вы отметили C# в вопросе, вы должны использовать C# для создания рекурсивной функции для вызова себя, если элемент имеет дочерние элементы.

PopulateMenu(); 
 

 
private void PopulateMenu() 
 
{ 
 
    var parentItems = GetMenuItemsWhereParentIdIsNull(); 
 
    foreach(var item in parentItems) 
 
    { 
 
    Console.WriteLine(item["Name"]); 
 
    PopulateChildrenByItem(item); 
 
    } 
 
} 
 

 
private void PopulateChildrenByItem(object item) 
 
{ 
 
    var childItems = GetMenuItemsByParentId(item["Id"]); 
 
    foreach(var item in childItems) 
 
    { 
 
    Console.WriteLine("Child Item: " + item["Name"]); 
 
    
 
    //Recursively check for children of this child item 
 
    PopulateChildrenByItem(item["Id"]); 
 
    } 
 
} 
 

 
function object GetMenuItemsWhereParentIdIsNull() 
 
{ 
 
    //code for getting the parent items from access via ado.net 
 
    //query should be something like "SELECT * FROM Menu WHERE ParentId IS NULL" 
 
} 
 

 
function object GetMenuItemsByParentId(int Id) 
 
{ 
 
    //code for getting the child items by given parentId from access via ado.net 
 
    //query should be something like "SELECT * FROM Menu WHERE ParentId = <Id>" 
 
}

Обратите внимание, что PopulateChildrenByItem вызывает себя для проверки дочерних элементов повторного элемента.

Я надеюсь, что это поможет вам в правильном направлении

Приветствия

+0

Папки имеют более 10000 документов Word –

+0

Это не должно быть проблемой с родительско-дочерней структурой. В чем проблема, с которой вы столкнулись? –

+0

1 таблица имеет все эти файлы без ошибок? –

1

Поскольку вы в дереве вы можете взглянуть на это:

Классы

public class FolderEntry { 

    public string Name { 
     get; set; 
    } 

    public List<FolderEntry> FolderEntries { 
     get; set; 
    } 

    public List<FileEntry> Files { 
     get; set; 
    } 


    } 


    public class FileEntry { 

    public string Name { 
     get; set; 
    } 

    public string FileType { 
     get; set; 
    } 

    } 

DataBase-Design:

Database

Это не полное решение, но с чего вы можете начать. Чтобы заполнить классы данными, я предлагаю вам реализовать RepositoryPattern

+0

Я попытался это понятие, но я не могу понять классы и Folders_FKIndex1? –

+0

Дерево рекурсивное. Таким образом, узел может иметь узел и так далее. Файл всегда ** ** в папке. Таким образом, файлы и папки имеют сильное отношение, отмеченное знаком ForeignKey (FK) – lokusking

+0

Понять сейчас - спасибо –

Смежные вопросы