数组中的文件,数组到树?

时间:2012-03-29 19:35:33

标签: c# visual-studio-2010 visual-studio-2008 clearcase

使用C#,我创建了一个执行命令行perl script的程序,并将输出捕获到文本文件中。输出来自ClearCase并且是一个巨大的痛苦要弄清楚,ClearCase插件的文档存在很多。

无论如何,现在我想要做的是跳过文件,只使用控制台的输出......

输出显示为

"\Directory\subDirectory\subsubDir\etc\dir\@@main\branch\version\4"
"\Directory\subDirectory\subsubDir\etc\dir\somefile.txt@@main\branch\version\3"
"\Directory\subDirectory\subsubDir\etc\dir\somefile.txt@@\branch\version\1"

然后我想基本上将其加载到tree view。这样树就会显示为目录列表......可以排序,因此很容易告诉任何特定文件或目录的最新版本。

一个问题是同一个目录和文件有多个实例,因为每个版本的特定文件都被计算在内,并且可能有不同的分支和版本......

我遇到麻烦,因为我对C#只有一点点经验,我无法理解如何在数组中加载数组,然后让它整齐地转到dynamic tree view(保持其关联)。

我发现树视图的大多数在线示例都有硬编码字符串,而不是动态字符串[]。

有没有人有这方面的经验?或者知道任何技巧?我无法决定Visual Studio的行编辑是否最好用于拆分目录或使用regex ...我将在稍后(一旦我弄明白)想要将此数据重新发送到clearcase通过命令提示符自动检出这些相关文件......但从这个角度来看,这部分似乎更容易......

我无法发布我拥有的代码,仅限闭环局域网。

我一直在摸索的树视图示例来自DotNetPerls

private void Form1_Load(object sender, EventArgs e)
{
    //
    // This is the first node in the view.
    //
    TreeNode treeNode = new TreeNode("Windows");
    treeView1.Nodes.Add(treeNode);
    //
    // Another node following the first node.
    //
    treeNode = new TreeNode("Linux");
    treeView1.Nodes.Add(treeNode);
    //
    // Create two child nodes and put them in an array.
    // ... Add the third node, and specify these as its children.
    //
    TreeNode node2 = new TreeNode("C#");
    TreeNode node3 = new TreeNode("VB.NET");
    TreeNode[] array = new TreeNode[] { node2, node3 };
    //
    // Final node.
    //
    treeNode = new TreeNode("Dot Net Perls", array);
    treeView1.Nodes.Add(treeNode);

以及来自D.Morton @ MSDN

的树的数组
public void AddTreeViewItem(string[] item)  
{  
TreeNodeCollection nodes = treeView1.Nodes;  

for (int i = 0; i < item.Length; i++)  
    nodes = nodes.Find(item[i], false).Length > 0 ? nodes.Find(item[i], false)
[0].  Nodes : nodes.Add(item[i], item[i]).Nodes;  
} 

2 个答案:

答案 0 :(得分:1)

下面的TreeBuilder类将为您构建一个合适的树。我已经用你的例子对它进行了测试,但它确实有用。如果树中存在间隙,它将递归修剪路径以创建缺少的父节点,然后展开以添加项本身。 TreeBuilder将问题分解为处理文件路径和版本路径,方法是在@@处拆分行。它将版本路径视为文件路径的子级。这允许内置的Path.GetFileName和Path.GetDirectoryName函数用于标记节点并修剪路径以查找父节点。

using System;
using System.Windows.Forms;
using System.IO;

public class TreeBuilder
{
    public TreeBuilder()
    {
        TreeNode rootNode = new TreeNode(@"\");
        rootNode.Name = @"\";

        RootNode = rootNode;
    }

    public TreeNode RootNode
    {
        get;
        set;
    }

    public void AddItems(string[] items)
    {
        Array.Sort(items);

        if (string.IsNullOrEmpty(RootNode.Name))
        {
            RootNode.Name = @"\";
        }

        foreach (string item in items)
        {
            string[] itemParts = item.Split(new string[] { "@@" }, StringSplitOptions.None);
            string filePath = itemParts[0].TrimEnd('\\');
            string versionPath = itemParts[1];

            TreeNode fileNode = AddNode(RootNode, filePath);
            TreeNode versionNode = AddNode(fileNode, filePath + "@@", versionPath);
        }
    }

    public TreeNode AddNode(TreeNode topNode, string path)
    {
        return AddNode(topNode, null, path);
    }

    public TreeNode AddNode(TreeNode topNode, string pathPrefix, string path)
    {
        pathPrefix = pathPrefix ?? string.Empty;

        TreeNode node = null;

        if (!string.IsNullOrEmpty(path) && topNode.Name != path)
        {
            string parentPath = Path.GetDirectoryName(path);

            TreeNode[] matchingNodes = topNode.Nodes.Find(pathPrefix + path, true);

            if (matchingNodes == null || matchingNodes.Length == 0)
            {
                string nodeLabel = Path.GetFileName(path);
                nodeLabel = string.IsNullOrEmpty(nodeLabel) ? @"\" : nodeLabel;

                node = new TreeNode(nodeLabel);
                node.Name = pathPrefix + path;

                TreeNode[] parentNodes = topNode.Nodes.Find(pathPrefix + parentPath, true);
                TreeNode parentNode = null;

                if (parentNodes != null && parentNodes.Length > 0)
                {
                    parentNode = parentNodes[0];
                    parentNode.Nodes.Add(node);
                }
                else
                {
                    parentNode = AddNode(topNode, pathPrefix, parentPath);
                    parentNode.Nodes.Add(node);
                }
            }
            else
            {
                node = matchingNodes[0];
            }
        }
        else
        {
            node = topNode;
        }

        return node;
    }
}

以下是一个如何在带有TreeView的表单中使用它的示例:

    private void Form1_Load(object sender, EventArgs e)
    {
        string[] fileStrings = new String[]
            {
                @"\Directory\subDirectory\subsubDir\etc\dir\@@main\branch\version\4",
                @"\Directory\subDirectory\subsubDir\etc\dir\somefile.txt@@main\branch\version\3",
                @"\Directory\subDirectory\subsubDir\etc\dir\somefile.txt@@\branch\version\1"
            };

        TreeBuilder treeBuilder = new TreeBuilder();
        treeBuilder.AddItems(fileStrings);

        treeView1.Nodes.Add(treeBuilder.RootNode);
        treeView1.ExpandAll();
    }

    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
    {
        TreeNode selectedNode = treeView1.SelectedNode;
        MessageBox.Show(string.Format("Label: {0}\nClearCase path: {1}\nTree path: {2}", selectedNode.Text, selectedNode.Name, selectedNode.FullPath));
    }

答案 1 :(得分:0)

其中一种可能的解决方案是按目录拆分字符串:

string[] directories =     "\Directory\subDirectory\subsubDir\etc\dir\@@main\branch\version\4".Split(Path.DirectorySeparatorChar);

拥有Dictionary<string, List<string>> tree,其中key目录路径List<string>是“密钥”目录的目录或文件列表。

如果不是您要搜索的内容,请澄清。