2014-10-20 194 views
2

我有一个显示一个文件夹的树形视图,与下面的格式的应用程序:在JSON中保存目录路径?

- Main Folder 
    - SubFolder 
    - SubFolder 
     - SubFolder 
    - SubFolder 

问题: 1)How do I search for all the folders (not files) and add them to a List called syncDirectories(FIXED)

2)How would I then iterate through my JSON object and save it back to List<SavedData> in order to add/remove data(FIXED)

3)How would I loop through my syncDirectories List and add all the nodes to the TreeView in WPF. (Keep in mind the treeview with checkbox class i am using.

等等。另外,这是一个演示格式的例子,用户可以有更多的子目录。

每个文件夹上有感谢这个TREEVIEW CLASS.

复选框为了保存所有文件夹和子文件夹的用户添加(和支票),我以为保存JSON文件中列出的所有文件夹和子文件夹路径以及它们的(真/假)检查值将是一个好主意。对?我正在使用Json.NET。

一些JSON瞎搞,我想出了这个格式:

{ 
    "path": "path/here", 
    "subDirectories": [ 
     {"path": "sub/path/here","sync": false}, 
     {"path": "sub/path/here","sync": true}, 
     {"path": "sub/path/here","sync": false} 
    ] 
} 

从而转化为类:

public class SavedData 
{ 
    public string path { get; set; } 
    public List<SubDirectory> subDirectories { get; set; } 
} 

public class SubDirectory 
{ 
    public string path { get; set; } 
    public bool sync { get; set; } 
    public List<SubDirectory> subDirectories { get; set; } 
} 

这就提出了一个问题,如何搜索所有的文件夹(不是文件),并将它们添加到名为syncDirectoriesList

以下是我在我的addDirectory功能至今:

private void addDirectory() 
{ 
    var dialog = new FolderBrowserDialog(); 
    DialogResult result = dialog.ShowDialog(); 
    if (result == System.Windows.Forms.DialogResult.OK) 
    { 
     SavedData data = new SavedData(); 
     data.path = dialog.SelectedPath; 
     syncedDirectories.Add(); 
    } 
    // Add the data to syncedDirectories List, then save the list and refresh the treeView 
    saveData(); 
} 

而且保存功能:

public void saveData() 
    { 
     JsonSerializer serializer = new JsonSerializer(); 
     using (StreamWriter sw = new StreamWriter(appData)) 
     using (JsonWriter writer = new JsonTextWriter(sw)) 
     { 
      serializer.Serialize(writer, syncedDirectories); 
     } 
    } 

当我将数据保存到一个文件,我怎么会那么遍历我的JSON对象并将其保存回List<SavedData>以添加/删除数据?

更新1

我已经想通了,如何处理我的数据(下同),但究竟如何,我会添加这些“节点”到TreeView?

public void getDirectories(string dir) 
    { 
     // Create the Data Object 
     SavedData data = new SavedData(); 
     data.path = dir; 
     data.subDirectories = new List<SubDirectory>(); 
     foreach (string directory in Directory.GetDirectories(dir)) 
     { 
      SubDirectory subDir = new SubDirectory(); 
      subDir.path = directory; 
      subDir.subDirectories = getSubDir(directory); 
      data.subDirectories.Add(subDir); 
     } 
     syncedDirectories.Add(data); 
    } 

    private List<SubDirectory> getSubDir(string dir) 
    { 
     List<SubDirectory> dataList = new List<SubDirectory>(); 
     SubDirectory subDir = new SubDirectory(); 
     foreach (string directory in Directory.GetDirectories(dir)) 
     { 
      subDir.path = directory; 
      subDir.subDirectories = new List<SubDirectory>(); 
      subDir.subDirectories = getSubDir(directory); 
      dataList.Add(subDir); 
     } 
     return dataList; 
    } 

后来,我打算在GitHub上发布这个程序开源。当我这样做时,我会在这里发布链接。

回答

1

经过几个小时的功能后,我意识到需要两个功能来完成这项任务。

public void getDirectories(string dir) 
    { 
     // Create the Data Object 
     SavedData data = new SavedData(); 
     data.path = dir; 
     data.subDirectories = new List<SubDirectory>(); 
     foreach (string directory in Directory.GetDirectories(dir)) 
     { 
      SubDirectory subDir = new SubDirectory(); 
      subDir.path = directory; 
      subDir.subDirectories = getSubDir(directory); 
      data.subDirectories.Add(subDir); 
     } 
     syncedDirectories.Add(data); 
    } 

    private List<SubDirectory> getSubDir(string dir) 
    { 
     List<SubDirectory> dataList = new List<SubDirectory>(); 
     SubDirectory subDir = new SubDirectory(); 
     foreach (string directory in Directory.GetDirectories(dir)) 
     { 
      subDir.path = directory; 
      subDir.subDirectories = new List<SubDirectory>(); 
      subDir.subDirectories = getSubDir(directory); 
      dataList.Add(subDir); 
     } 
     return dataList; 
    } 

这得到的主目录然后循环,找到所有的子目录,并将它们添加到我的列表。