【问题标题】:Print number of file and directories giving the path打印给出路径的文件和目录的数量
【发布时间】:2021-03-26 01:05:29
【问题描述】:

正如标题所说,我正在寻找一种方法来打印树中的所有目录和文件。我有一棵这样的树:

C:/
├── Program Files/
│   └── Word
└── Program Files (x64)/
    ├── Chrome
    └── Ink

我的代码经过一个分支,我无法返回进入新文件夹。例如,我可以在 Chrome 中进行计数,但由于我的代码结束了迭代,我无法返回查看 Ink 内部。这里是:

    private void countFiles(string directoryPath, string VmVsphereName, string restorePointID)
    {
        //Verifica autorizzazione sui dati
        Guid oidVm;
        using (TSCLOUDEntities context = new TSCLOUDEntities())
        {
            oidVm = (
                        from vm in context.VM10_MACCHINE_VIRTUALI
                        where vm.VM10_VSPHERE_NAME == VmVsphereName
                        select vm.VM10_OID
                     ).Concat(
                        from vm in context.NCL10_VIRTUAL_MACHINE
                        where vm.NCL10_VSPHERE_NAME == VmVsphereName
                        select vm.NCL10_OID
                     ).Single();
        }

        TipoPiattaformaCloud tipoPiattaformaCloud = Bll_VirtualMachines.GetCloudPlatfomOfVm(oidVm);
        VeeamCredential veeamCredential = Code.Config.Instance.GetVeeamCredential(tipoPiattaformaCloud);

        string veeamResponseHeader = GetVeeamResponseHeader();
        string veeamSessionId = GetVeeamSessionId();
        VeeamClient veeamClient = new VeeamClient(veeamCredential, veeamResponseHeader, veeamSessionId);

        if (href == "")
        {
            fileSystemEntries = CatalogUtility.GetFileSystemEntries(veeamClient, VmVsphereName, restorePointID, directoryPath);
            files += Directory.GetFiles(directoryPath, "*.*", SearchOption.AllDirectories).Count();
            directories += Directory.GetDirectories(directoryPath, "*.*", SearchOption.AllDirectories).Count();
        } else
        {
            fileSystemEntries = CatalogUtility.GetFileSystemEntriesByHref(veeamClient, href);
            files += Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Count();
            directories += Directory.GetDirectories(path, "*.*", SearchOption.AllDirectories).Count();
        }

        for (int i = 0; i < fileSystemEntries.Directories.Count(); i++)
        {
            try
            {
                path = fileSystemEntries.Directories[i].Path;
                href = fileSystemEntries.Directories[i].Href;
                var stepInside = CatalogUtility.GetFileSystemEntriesByHref(veeamClient, href);
                directories += stepInside.Directories.Count();
                files += stepInside.Files.Count();
                if (stepInside.Files.Count() != 0)
                {
                    foreach (var file in stepInside.Files)
                    {
                        space += file.Size;
                    }
                }
                if (stepInside.Directories.Count() > 0)
                {
                    countFiles(path, VmVsphereName, restorePointID);
                }
            } catch (UnauthorizedAccessException ex)
            {
                continue;
                //Do nothing
            }
            catch (Exception ex)
            {
                log.Error(ex);
            }
            directories += fileSystemEntries.Directories.Count();
            files += fileSystemEntries.Files.Count();
            count += 1;
        }
    }

希望我很清楚。谢谢大家

【问题讨论】:

  • 我很困惑,您是否正在寻找 java 或 c# 的答案?
  • 对不起@DevlinPaddock。它适用于 C#。谢谢你的问题。我会编辑它!

标签: c# binary-tree


【解决方案1】:

这是一个应该递归执行此操作的示例。

public static void RecursivePrintFiles(string Path, int TabDepth)
{
    int tabDepth = TabDepth;
    while (tabDepth-- > 0)
      Console.Write("\t");
    Console.Write(System.IO.Path.GetFileName(Path) + "\r\n");
    IEnumerable<string> Directories = Directory.EnumerateDirectories(Path);
    IEnumerable<string> Files = Directory.EnumerateFiles(Path);
    tabDepth = TabDepth;
    foreach (string file in Files)
    {
       while (tabDepth-- > 0)
          Console.Write("\t");
       Console.Write(System.IO.Path.GetFileName(file) +"\r\n");
    }
  foreach (string Directory in Directories)
     RecursivePrintFiles(Directory, ++TabDepth);
}
private static void Main(string[] args)
{
    string Path = "C:\\Users\\devlinp\\Downloads\\mlem";
    RecursivePrintFiles(Path, 0);
}

我发现递归在这种情况下真的很有帮助。我会尝试将此代码用作启动器并将其更改为您正在寻找的格式。

【讨论】:

  • 即使我尝试正确使用递归,我也确实遇到了问题。感谢您的回答。我会努力适应我的代码并在给出正确答案之前尝试一下!
  • 一个问题@devlin。什么是对象 TabDepth?
  • @user9420152 我使用该变量来跟踪要添加到开头的选项卡的数量(因此,如果文件或文件夹向下 3 级,它将缩进 3 次)它也可以用于跟踪如何你已经通过函数递归了很多次
  • 我不知道我的路径有多深,因为它每次都会改变。你认为有办法知道它知道路径吗?
  • @user9420152 如果您以递归方式执行此操作,您将随时跟踪您的深度。该函数将输出传递给它的任何文件夹中的文件,然后在该文件夹中的任何文件夹上调用自身。增加它的深度
猜你喜欢
  • 1970-01-01
  • 2019-11-11
  • 2016-08-17
  • 1970-01-01
  • 2016-11-24
  • 2014-04-25
  • 2017-04-03
  • 2016-05-16
  • 1970-01-01
相关资源
最近更新 更多