Файлы в массиве, в массиве в дерево? - PullRequest
2 голосов
/ 29 марта 2012

Используя 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"

I тогдахочу в основном загрузить это в tree view.Таким образом, дерево отображается в виде списка каталогов ... которое можно сортировать, поэтому легко определить последнюю версию любого конкретного файла или каталога.

Одна проблема состоит в том, что существует несколько экземпляров одного и того же каталога ифайлы, так как каждая версия определенного файла считается, и могут быть разные ветви и версии ...

У меня проблема, потому что я только немного разбираюсь в C#, и я не совсем понимаю, как загрузитьзатем массивы в массивах аккуратно переходят в dynamic tree view (сохраняя свои ассоциации).

Большинство онлайн-примеров для представлений дерева, которые я нахожу, имеют жестко закодированные строки, а не динамические строки [].

У кого-нибудь есть такой опыт?Или знаете какие-нибудь хитрости?Я не могу решить, лучше ли использовать редактирование строк в Visual Studio для разделения каталогов или использовать regex ... Я позже (когда я это выясню) захочу повторно отправить эти данные в открытый регистр черезКомандная строка для автоматического извлечения этих связанных файлов ... но эта часть кажется проще с этой точки зрения ...

Я не могу опубликовать код, который у меня есть, только по замкнутому циклу lan.

Пример вида дерева, на котором я почесал голову, взят из 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 ]

1 голос
/ 30 марта 2012

Класс 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));
    }
0 голосов
/ 29 марта 2012

Одно из возможных решений может быть разбито строкой по каталогам:

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

после того, как есть Dictionary<string, List<string>> tree, где key - это Путь к каталогу и List<string>список каталогов или файлов каталога «ключ».

Если это не то, что вы ищете, уточните.

...