Access数据库中的文件和目录

时间:2016-06-28 11:36:50

标签: c# database ms-access

我正在开发一个程序,其中包含一个目录(主目录和每个目录包含子目录,每个子目录包含sub2目录等等......直到最终目录包含.doc文件作为对象。) 示例: enter image description here

如何设计数据库以接受此树层次结构,然后我可以获取每个目录并在我的c#程序中打开任何.doc。

我是使用树视图和数据库的初学者。

由于

修改

我有7个主文件夹,每个文件夹都有多个子文件夹,可能有些子文件夹1有另外的子文件夹2,其中包含文件,其他子文件夹1也有文件。 (所有文件几乎都是10000。)

问题:

我如何将此结构填充到数据库中,然后我可以在树视图或列表框中列出它们?

由于

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

只需一张桌子就可以获得无限级别的无限结构。我将在这里使用MS SQL。但同样的逻辑也适用于MS Access。

enter image description here

Id是行的唯一标识符。 ParentId是对此行所在的Id的引用。换句话说,当前行的Parent。 Name是包含目录或文件名的字段。 IsFile(可以省略)是确定这是文件还是目录。您实际上可以在代码中应用一些逻辑来检查该行是否有任何子代。如果此行中有子项,则只需将其标记为目录即可。

然后我们可以用一些数据填充这个表

enter image description here

如果您使用的是MS SQL Server 2005及更高版本,则只需创建一个CTE(公用表表达式)即可自动生成整个树。但是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正在调用自身来检查迭代项的子项。

我希望这会引导你走向正确的方向

干杯