Лучший способ получить путь ко всем файлам, вложенным в большую папку? - PullRequest
0 голосов
/ 03 сентября 2018

Ниже приведен мой код для получения всех файлов в большой директории (Framework 3.5). Это работает ~ 1 час, но не может закончить, память в диспетчере задач до 1 600 000 К

void ApplyAllFiles(DirectoryInfo dir)
{
    String space = "          ";
    foreach (FileInfo f in dir.GetFiles())
    {
        try
        {            
            int size = Convert.ToInt32(f.Length / 1024);
            if (size > filesize && isFileType(f.FullName) == true)
            {
                pw.WriteLine(f.LastWriteTime + space + size + space + f.FullName);
            }
        }
        catch
        { }
    }
    foreach (DirectoryInfo d in dir.GetDirectories())
    {
        try
        {
            ApplyAllFiles(d);
        }
        catch
        {

        }
    }
}

Если я использую код Java, только 5 минут для финиша и память всегда <100 000 К. Я думаю, что код C # может иметь проблемы (getFiles & getDirectories не подходит для больших каталогов). Я надеюсь, что кто-то может помочь. </p>


Я решил это, запустив петлю в каждой попытке {}.

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Как утверждают другие пользователи, Directory.GetFiles ужасно. Directory.EnumerateFiles является альтернативой .

Ссылка от здесь

0 голосов
/ 03 сентября 2018

Вы можете создать нерекурсивный метод расширения:

public static IEnumerable<FileInfo> GetFilesDepthFirst(this DirectoryInfo root,
    string dirPattern = "*", string filePattern = "*.*")
{
    var stack = new Stack<DirectoryInfo>();
    stack.Push(root);
    while (stack.Count > 0)
    {
        var current = stack.Pop();
        IEnumerable<FileInfo> files = Enumerable.Empty<FileInfo>();
        IEnumerable<DirectoryInfo> dirs = Enumerable.Empty<DirectoryInfo>();

        try
        {
#if NET35
            dirs = current.GetDirectories(searchPattern: dirPattern);
            files = current.GetFiles(searchPattern: filePattern);
#else
            dirs = current.EnumerateDirectories(searchPattern: dirPattern);
            files = current.EnumerateFiles(searchPattern: filePattern);                  
#endif
        }
        catch (UnauthorizedAccessException) { }
        catch (PathTooLongException) { }

        foreach (FileInfo file in files)
            yield return file;

        foreach (DirectoryInfo dir in dirs)
            stack.Push(dir);
    }
}

Который вы можете назвать как:

var dInfo = new DirectoryInfo("C:\\");
var allFiles = dInfo.GetFilesDepthFirst(filePattern: "*.txt");
foreach(FileInfo file in allFiles)
{
    // build output string
}
...