Я пишу программу, чтобы найти все файлы типа на компьютере (в настоящее время файлы изображений), и я использую хвостовую рекурсию для поиска каталогов таким образом:Проблемы с хвостовой рекурсией в файловых операциях (C#)
private void ImageSearchByDir(DirectoryInfo dir)
{
//search for images by directory, later display them with this method when I get basic search working
foreach (var f in dir.GetFiles())
{
//add file info to current list
this.myfiles.Add(f);
}
foreach (var d in dir.GetDirectories())
{
//recursive call to iterate through subdirectories
ImageSearchByDir(d);
}
}
Проблема возникает при поиске каталогов с большим количеством файлов. Например, я искал папку с ~ 700 изображениями, расположенными под 3 уровнями папок, без проблем, но попытка поиска на моем рабочем столе нарушает работу программы. Я предполагаю, что это имеет какое-то отношение к рекурсии и результирующему размеру стека, и я хотел бы реализовать более элегантное решение, если это возможно (я прочитал о батуте, но я не уверен на 100%, что это исправит).
1) Какое исключение сделал Вы получите? 2) Вероятно, достаточно собрать только имя файла как _string_, но не как _FileInfo_? – Jackdaw
Что вы делаете, это рекурсия, но не квалифицируется как рекурсия хвоста. Рекурсия хвоста потребует, чтобы после вызова не было никаких дополнительных операций в функции. В вашем случае цикл foreach должен запускать проверку для большего количества элементов после каждого рекурсивного вызова, делая это не-хвост-рекурсивным. Ответ Луисо дает возможность сделать это без рекурсии. –
В ответ на Jackdaw я не получаю ошибки, программа просто остается в состоянии загрузки (белый фон, синий стол для загрузки курсора, щелчок по нему обозначает его «Не отвечает»). И Гедеон вы делаете хороший момент, извините, если моя формулировка вводит в заблуждение. – Antidiscrete