Файловая система TreeView

Вы не можете сделать это, используя встроенные массивы. Тот факт, что массивы не являются ни назначаемыми, ни копируемыми. Также они не являются классами, поэтому у них нет функций-членов, таких как size(), или они принимают Initializer-list.

Этого можно добиться с помощью std::array, если размер постоянен, или с помощью std::vector, если размер динамический.

#include <array>


int func(const std::array<int, 5>& values) { 

    int average = 0;
    for (size_t x{}, sz{ values.size() }; x != sz ; ++x)
        average += values[x];

    return average / values.size();
}



int main() {
    auto ret{
        func({ 1, 6, 7, 2 })
    };

    std::cout << ret << std::endl;
}
  • Также не смешивайте Unsigned с Signed в вычислениях, как в вашем цикле:

    for(int x = 0; x < values.size(); x++) // x is int while values.size() is unsigned int.
    
  • int func(const std::array<int, 5>& values): передать по ссылке на избегайте копирования, особенно если размер большой. Также проходите через const, пока функция не намеревается изменить параметр, также еще одно преимущество использования ссылки на const - вы можете передавать литералы вместо объекта.

  • Примечание: я рекомендую также использовать range-based for, потому что это действительно актуально в вашем примере, если вы хотите перебрать все элементы и не намереваться insert или delete элементов:

    int average = 0;
    for (const auto& e : values)
        average += e;
    
  • Другая версия func, на которую указывает @MM, заключается в том, чтобы использовать std::accumalate для выполнения этой работы за вас:

    int func(const std::array<int, 5>& values) {    
        return std::accumulate(values.begin(), values.end(), 0) /
            values.size();
    }
    
]
8
задан Jon Skeet 23 March 2009 в 15:52
поделиться

4 ответа

Если бы Вы хотели придерживаться строк, то что-то вроде этого работало бы...

TreeNode root = new TreeNode();
TreeNode node = root;
treeView1.Nodes.Add(root);

 foreach (string filePath in myList) // myList is your list of paths
 {
    node = root;
    foreach (string pathBits in filePath.Split('/'))
    {
      node = AddNode(node, pathBits);
    }
 }


private TreeNode AddNode(TreeNode node, string key)
{
    if (node.Nodes.ContainsKey(key))
    {
        return node.Nodes[key];
    }
    else
    {
        return node.Nodes.Add(key, key);
    }
}
16
ответ дан 5 December 2019 в 06:54
поделиться

Я превратил бы строку в FileInfo.

После того как Вы сделали, чтобы FileInfo возразил, можно использовать свойство Directory для получения DirectoryInfo для каждого пути.

После того как у Вас есть DirectoryInfo для пути, легко "идти" по Родительской ссылке в DirectoryInfo для превращения каждого пути к списку каталогов + имя файла - т.е.:

{"C:","Windows","Temp","ErrorLog.txt"}

Это должно быть довольно просто для вставки в treeview. Просто ищите каждый раздел пути в свою очередь, и если он не существует, добавьте его....

4
ответ дан 5 December 2019 в 06:54
поделиться

дайте рекурсии попытку.

private void AddFiles()
{
  // Iterate your list with FileInfos here
  foreach( var fileInfo in new Collection<FileInfo>() )
  {
    GetOrCreateTreeNode( fileInfo.Directory ).Nodes.Add( new TreeNode( fileInfo.Name ) );
  }
}

private TreeNode GetOrCreateTreeNode( DirectoryInfo directory )
{
  if( directory.Parent == null )
  {
    // Access your TreeView control here:
    var rootNode = <TreeView>.Nodes[directory.Name];
    if( rootNode == null )
    {
      rootNode = new TreeNode(directory.Name);
      // Access your TreeView control here:
      <TreeView>.Nodes.Add( rootNode );
    }
    return rootNode;
  }

  var parent = GetOrCreateTreeNode( directory.Parent );
  var node = parent.Nodes[directory.Name];
  if( node == null )
  {
    node = new DirectoryNode( directory );
    parent.Nodes.Add( node );
  }
  return node;
}

Этот код должен дать Вам только идею - я должен признать, что не протестировал его прежде, чем отправить здесь.

2
ответ дан 5 December 2019 в 06:54
поделиться
    private void Form1_Load(object sender, EventArgs e)
    {
        var paths = new List<string>
                        {
                            @"C:\WINDOWS\AppPatch\MUI\040C",
                            @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727",
                            @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MUI",
                            @"C:\WINDOWS\addins",
                            @"C:\WINDOWS\AppPatch",
                            @"C:\WINDOWS\AppPatch\MUI",
                            @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MUI\0409"
                        };
        treeView1.PathSeparator = @"\";
        PopulateTreeView(treeView1, paths, '\\');
    }

    private static void PopulateTreeView(TreeView treeView, IEnumerable<string> paths, char pathSeparator)
    {
        TreeNode lastNode = null;
        string subPathAgg;
        foreach (string path in paths)
        {
            subPathAgg = string.Empty;
            foreach (string subPath in path.Split(pathSeparator))
            {
                subPathAgg += subPath + pathSeparator;
                TreeNode[] nodes = treeView.Nodes.Find(subPathAgg, true);
                if (nodes.Length == 0)
                    if (lastNode == null)
                        lastNode = treeView.Nodes.Add(subPathAgg, subPath);
                    else
                        lastNode = lastNode.Nodes.Add(subPathAgg, subPath);
                else
                    lastNode = nodes[0];
            }
        }
    }

alt text

2
ответ дан 5 December 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: