Как сказано в заголовке, я ищу способ распечатать все каталоги и файлы в дереве. У меня есть такое дерево:
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;
}
}
Надеюсь, я был понятен. Спасибо всем
Прости, @DevlinPaddock. Это для С#. Спасибо за вопрос. буду редактировать!
Вот пример, который должен рекурсивно делать это.
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 user9420152 я использовал эту переменную, чтобы отслеживать, сколько вкладок нужно добавить в начало (поэтому, если файл или папка находится на 3 уровня ниже, отступ будет 3 раза), ее также можно использовать для отслеживания того, сколько раз вы повторно выполняли функцию.
Я не могу знать глубину своего пути, потому что он меняется каждый раз. Как вы думаете, есть ли способ узнать это, зная путь?
@user9420152 user9420152, если вы сделаете это рекурсивно, вы будете отслеживать, на какой глубине вы находитесь, когда идете. эта функция выводит файлы в любой переданной ей папке, а затем вызывает себя в любой папке в этой папке. увеличивая его глубину
я запутался, вы ищете ответ на Java или С#?