C# 文件在数组中,在数组到树中?

C# 文件在数组中,在数组到树中?,c#,visual-studio-2010,visual-studio-2008,clearcase,C#,Visual Studio 2010,Visual Studio 2008,Clearcase,使用C#,我创建了一个程序,该程序执行命令行perl脚本,并将输出捕获到文本文件中。输出来自ClearCase,这是一个巨大的难题,ClearCase插件的文档编制方式并不多 无论如何,现在我想做的是跳过文件,只使用控制台的输出 输出如下所示 "\Directory\subDirectory\subsubDir\etc\dir\@@main\branch\version\4" "\Directory\subDirectory\subsubDir\etc\dir\somefile.txt@@mai

使用
C#
,我创建了一个程序,该程序执行命令行
perl脚本
,并将输出捕获到文本文件中。输出来自
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"
然后我想基本上把它加载到
树视图中。因此,树显示为一个目录列表…可以进行排序,以便很容易地告诉任何特定文件或目录的最新版本

一个问题是,当计算特定文件的每个版本时,同一目录和文件有多个实例,并且可能有不同的分支和版本

我遇到了麻烦,因为我对
C#
只有一点经验,我不能完全理解如何在数组中加载数组,然后让它整齐地进入
动态树视图(保持其关联)

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

有人有这样做的经验吗?或者知道什么把戏?我无法决定是使用Visual Studio的行编辑来拆分目录还是使用
regex
…我将在稍后(一旦我解决了这个问题)希望通过命令提示符将此数据重新发送到clearcase以自动签出这些关联文件…但从这个角度来看,这部分似乎更容易

我不能发布我的代码,只有闭环局域网

我一直挠头的treeview的例子来自:

对于从D.Morton@

public void AddTreeViewItem(字符串[]项)
{  
TreeNodeCollection节点=树视图1.节点;
for(int i=0;i0?节点。查找(项目[i],错误)
[0]。节点:节点。添加(项目[i],项目[i])。节点;
} 

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

string[] directories =     "\Directory\subDirectory\subsubDir\etc\dir\@@main\branch\version\4".Split(Path.DirectorySeparatorChar);
在拥有
字典树之后
,其中
是目录路径,
列表
是“键”目录的目录或文件列表


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

下面的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;
    }
}
下面是一个示例,说明如何在带有树视图的表单中使用它:

    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));
    }

如果无法发布代码,请在家或其他地方发布一些有类似问题的代码。为了保留文件和分支关联,我是否需要将整行保留为字符串,然后将各个目录/子目录加载到字符串并重新匹配树?抱歉,如果这让我感到困惑,我想我不知道如何解释自己。如果是
分支
,我想你可以简单地中继
拆分
调用,你还需要添加一个解析器,用于
@@main
@@branch
@Tigran在目录分隔符上拆分实际上不是最好的方法。由于这些是路径,您可以在@处拆分它们,然后使用System.IO.Path中的函数处理这两个路径。@JamieSee:正确。这就是我在对OP的评论中建议做的。更新了我的原始答案,进行了一些重构,并添加了可以处理树中的漏洞的新代码。哇,谢谢!这是惊人的!不客气。幸运的是,当我想对SQL Reporting Services目录项进行树状显示时,我必须解决几乎相同的问题,这样我就已经熟悉了解决方案的一般术语,并且可以对其进行调整。是的,再次感谢。。。网上没有太多的treeview方法的例子。我确实遇到了两个小问题,一个我很容易解决,因为字符串中有一些我没有解释的行不包含任何编码匹配,它引发了一个异常。我取出它们,它运行正常,直到我在路径异常中遇到非法字符,字符在第二个路径块“\r”中。在将它们加载到树中之前,我正在对它们进行解析。我将张贴我完成的代码,一旦我得到这个东西的工作。无论如何,我必须在这个系统上重写整个过程。你可以编写几个快速修剪函数来替换
路径。
调用。我只是用它们来节省时间,因为您最初的示例在拆分后看起来像是符合Windows路径规范。
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;
    }
}
    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));
    }