使用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;
}
答案 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>
是“密钥”目录的目录或文件列表。
如果不是您要搜索的内容,请澄清。