使用非空文件夹填充TreeView

时间:2015-10-01 17:13:56

标签: c# treeview

private void ListDirectory(TreeView treeView, string path)
{
    treeView.Nodes.Clear();
    var rootDirectoryInfo = new DirectoryInfo(path);
    treeView.Nodes.Add(CreateDirectoryNode(rootDirectoryInfo));
}

private static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo)
{
    var directoryNode = new TreeNode(directoryInfo.Name);
    foreach (var directory in directoryInfo.GetDirectories())
        directoryNode.Nodes.Add(CreateDirectoryNode(directory));
    foreach (var file in directoryInfo.GetFiles().Where(s => s.Extension == ".jpg"))
        directoryNode.Nodes.Add(new TreeNode(file.Name));
    return directoryNode;
}

使用此代码我可以列出给定目录中的所有jpg文件和文件夹。但它也会列出jpg文件的空文件夹。我怎么能避免它?

2 个答案:

答案 0 :(得分:1)

您需要检查子目录的数量是否为零,目录中的文件数是否为零。如果是这种情况,则不应创建节点。

执行此操作的一种方法是,如果目录不符合规范,则从null方法返回CreateDirectoryNode。然后只添加不是null的子节点。

考虑以下代码:

private void ListDirectory(TreeView treeView, string path)
{
    treeView.Nodes.Clear();
    var rootDirectoryInfo = new DirectoryInfo(path);

    var tree_node = CreateDirectoryNode(rootDirectoryInfo);

    if (tree_node != null)
        treeView.Nodes.Add(tree_node);
}

//This method will return null of the specified directory does not have sub folders or JPG files
private static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo)
{
    //Obtain all sub directories
    var sub_directories = directoryInfo.GetDirectories();

    //Obtain all JPG files
    var jpeg_files =
        directoryInfo.GetFiles()
            .Where(s => s.Extension.Equals(".jpg", StringComparison.OrdinalIgnoreCase))
            .ToArray();

    //If the above arrays are empty, return null
    if (sub_directories.Length == 0 && jpeg_files.Length == 0)
        return null;

    var directoryNode = new TreeNode(directoryInfo.Name);

    foreach (var directory in sub_directories)
    {
        var sub_node = CreateDirectoryNode(directory);

        if(sub_node != null) //Only add sub nodes if they are not null
            directoryNode.Nodes.Add(sub_node);
    }

    foreach (var file in jpeg_files)
        directoryNode.Nodes.Add(new TreeNode(file.Name));


    return directoryNode;
}

答案 1 :(得分:1)

解决方法是检查递归返回是否有任何文件,如果存在则添加。

foreach (var directory in directoryInfo.GetDirectories())
{
    TreeNode subNode = CreateDirectoryNode(directory);
    if (subNode.Nodes.Count > 0)
        directoryNode.Nodes.Add(CreateDirectoryNode(directory));
}

由于您正在进行深度优先搜索,如果没有任何文件,节点将从叶子到根目录被有效地剔除。