문제

누구나 디렉토리와 하위 폴더를 통해 열거 된 모든 파일을 수집하는 더 빠른 방법을 알고 있습니까? 이것이 제가 지금 가지고있는 것입니다.

Public Shared allFiles() As String
allFiles = Directory.GetFiles(<ServerLocation>, "*.*", SearchOption.AllDirectories)

감사! JFV

편집 : 서버 위치에서 이러한 파일을 열거하고 있습니다. 그것이이 질문의 관점을 바꿀지 모르겠습니다. 지금까지 모든 입력에 감사드립니다!

도움이 되었습니까?

해결책

짧은 대답:

이 코드가 프로젝트에 대해 기능적으로 정확하고 프로파일 러에게 문제가되는 것으로 판명되지 않은 경우 변경하지 마십시오. 속도가 느리다는 것을 증명할 때까지 기능적으로 올바른 솔루션을 계속 사용하십시오.

긴 답변 :

이 특정 코드가 얼마나 빠르거나 느리는지 많은 요인의. 그 중 다수는 실행중인 특정 시스템 (예 : 하드 드라이브 속도)에 따라 다릅니다. 파일 시스템과 다른 것이없는 코드를 살펴보면 어느 정도의 확실성으로 "X가 Y보다 빠르다"고 말하기는 매우 어렵습니다.

이 경우, 나는 한 가지에 대해서만 댓글을 달 수 있습니다. 이 메소드의 리턴 유형은 FileInfo 값의 배열입니다. 배열에는 인접한 메모리가 필요하며 매우 큰 배열은 힙에 조각화 문제를 일으킬 수 있습니다. 당신이 가지고 있다면 극도로 당신이 읽고있는 큰 디렉토리는 힙 단편화와 간접적으로 성능 문제로 이어질 수 있습니다.

그것이 문제로 판명되면 findfirstfile / findnextfile에 들어가서 한 번에 하나씩 얻을 수 있습니다. 결과는 CPU 사이클에서는 기능적으로 느리게 될 가능성이 있지만 메모리 압력이 적을 것입니다.

하지만 나는 당신이 이것들이 당신 앞에 문제임을 증명해야한다고 강조해야합니다. 고치다 그들을.

다른 팁

System.collections.generic 사용;

private static List<string> GetFilesRecursive(string b)
{

             // 1.
            // Store results in the file results list.
            List<string> result = new List<string>();

            // 2.
            // Store a stack of our directories.
            Stack<string> stack = new Stack<string>();

            // 3.
            // Add initial directory.
            stack.Push(b);

            // 4.
            // Continue while there are directories to process
            while (stack.Count > 0)
            {
                // A.
                // Get top directory
                string dir = stack.Pop();

                try
                {
                    // B
                    // Add all files at this directory to the result List.
                    result.AddRange(Directory.GetFiles(dir, "*.*"));

                    // C
                    // Add all directories at this directory.
                    foreach (string dn in Directory.GetDirectories(dir))
                    {
                        stack.Push(dn);
                    }
                }
                catch
                {
                    // D
                    // Could not open the directory
                }
            }
            return result;
        }

원본 기사에 대한 소품 : http://www.codeproject.com/kb/cs/workerthread.aspx

이것은 조잡한 방법입니다.

dir /s /b

이것의 출력을 텍스트 파일로 가져 와서 읽고 나뉘어 \r\n.
특정 디렉토리에서 위 명령을 실행하여 도움이되는지 확인하십시오.

디렉토리 만 얻으려면

dir /s /b /ad

파일 만 얻으려면

dir /s /b /a-d

편집 : Jared는 접근 방식이 느리게 입증되지 않는 한 다른 접근법을 사용하지 말라고 말하는 것이 옳습니다.

그녀는 내 솔루션입니다. 초기 시작은 조금 느립니다. my.computer.filesystem 객체는 느리게 시작하는 데 문제가 있습니다. 그러나이 방법은 네트워크를 통해 5 분 이내에 31,000 개의 파일을 나열합니다.

Imports System.Threading

Public Class ThreadWork

Public Shared Sub DoWork()
    Dim i As Integer = 1
    For Each File As String In My.Computer.FileSystem.GetFiles("\\172.16.1.66\usr2\syscon\S4_650\production\base_prog", FileIO.SearchOption.SearchTopLevelOnly, "*.S4")
        Console.WriteLine(i & ". " & File)
        i += 1
    Next
End Sub 'DoWork
End Class 'ThreadWork

Module Module1

Sub Main()
    Dim myThreadDelegate As New ThreadStart(AddressOf ThreadWork.DoWork)
    Dim myThread As New Thread(myThreadDelegate)
    myThread.Start()
    '"Pause" the console to read the data.
    Console.ReadLine()
End Sub 'Main

End Module
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top