2016-06-28 3 views
0

나는 (주요 디렉토리와 각 디렉토리는 하위 디렉토리를 포함하고 각 하위 디렉토리는 sub2 디렉토리를 포함하는 등의 프로그램이 있습니다 ... 최종 디렉토리에 .doc 파일이 포함될 때까지 객체로) 예 :. enter image description hereAccess 데이터베이스 내의 파일과 디렉토리

그때 내가 각 디렉토리를 얻을 수있는이 나무 계층 구조를 받아 내 C# 프로그램의 모든 덕을 열 수있는 데이터베이스를 설계 할 수있는 방법.

저는 트리 뷰와 데이터베이스를 사용하는 초심자입니다.

감사

편집 :

나는 7 개 주 폴더가 있고 각 폴더는 다른 하위 하위 폴더의 번호를 가지고 있으며, 일부 하위 folders1 파일을 포함하는 다른 하위 folders2이 될 수있다 -folders1도 파일을 가지고 있습니다. (모든 파일은 거의 10000입니다.)

질문 : 데이터베이스에이 구조를 채우는 방법

그때 내가 트 리뷰 나리스트 박스에서 그들을 나열 할 수 있습니다?

감사

답변

1

하나의 테이블로 무제한 무한 구조로 이동할 수 있습니다. 나는 여기서 MS SQL을 사용할 것이다. 그러나 동일한 논리가 MS Access에도 적용됩니다.

enter image description here

이드 행의 고유 식별자이다. ParentId는이 행이 표시되는 ID에 대한 참조입니다. 즉, 현재 행의 Parent. 이름은 디렉토리 또는 파일 이름을 포함하는 필드입니다. IsFile (생략 가능)은 파일 또는 디렉토리인지 확인하는 것입니다. 코드에 논리를 적용하여 행에 자식이 있는지 확인할 수 있습니다. 이 행의 하위 항목이 있으면 단순히 디렉토리로 표시 할 수 있습니다. 당신이 이후 MS SQL 서버 2005을 사용한 경우

그런 다음 우리는 당신이 단순히 CTE (공통 테이블 식)를 만들 수 있습니다 자동으로 전체 트리를 만들기 위해 일부 데이터

enter image description here

으로이 테이블을 채울 수 있습니다 . 그러나 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 개 이상의 단어 문서가 있습니다 –

+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

이것은 완전한 해결책은 아니지만 시작할 수있는 방법입니다. 데이터로 클래스를 채우려면 RepositoryPattern을 구현하는 것이 좋습니다

+0

건배를 희망하지만 난 클래스와 Folders_FKIndex1을 이해할 수 없다? –

+0

트리는 재귀 적 구조입니다. 그래서 노드는 노드를 가질 수 있습니다. 파일은 ** 항상 ** 폴더에 있습니다. 그래서 파일과 폴더는 ForeignKey (FK)와 강한 관계가 있습니다 – lokusking

+0

지금 이해하십시오 - 감사합니다 –