打印给出路径的文件和目录的数量
Print number of file and directories giving the path
正如标题所说,我正在寻找一种方法来打印树中的所有目录和文件。我有一棵这样的树:
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;
}
}
希望我说清楚了。感谢大家
这是一个应该递归执行此操作的示例。
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);
}
我发现递归在这种情况下非常有用。我会尝试使用此代码作为入门代码并将其更改为您要查找的格式。
正如标题所说,我正在寻找一种方法来打印树中的所有目录和文件。我有一棵这样的树:
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;
}
}
希望我说清楚了。感谢大家
这是一个应该递归执行此操作的示例。
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);
}
我发现递归在这种情况下非常有用。我会尝试使用此代码作为入门代码并将其更改为您要查找的格式。