2009-06-08 3 views
2

나는 디렉토리를 선택하고 그 디렉토리와 하위 디렉토리에있는 파일의 총 크기를 계산할 수있는 작은 응용 프로그램을 만들었습니다.폴더 크기를 분석하는 앱 ?? C# .net

이렇게하면 드라이브를 선택할 수 있으며 드라이브가있는 트리 컨트롤을 채워서 드라이브의 즉각적인 폴더를 만들 수 있습니다.

.net으로 작성되었으며 디렉토리에서 간단하게 순환합니다. 각 디렉토리에 대해 파일 크기가 합산됩니다.

Windows 또는 프로그램 파일 폴더를 실행할 때 내 PC가 정지됩니다.

멀티 스레딩을 생각했지만 이전에이 작업을 수행하지 않았습니다.

성능을 향상시킬 아이디어가 있습니까?

감사합니다.

+0

코드를 살펴 보겠습니다. – RedFilter

+0

나는 부정적이되고 싶지는 않지만 바퀴를 다시 발명하고 있습니다. http://foldersize.sourceforge.net/ – Kane

+0

또는 SpaceMonger : http://www.sixty-five.cc/sm/v1x.php 또는 SequoiaView : http : //w3.win.tue보다 나은 대안이 될 수 있습니다. nl/nl/onderzoek/onderzoek_informatica/시각화/sequoiaview/ – adrianbanks

답변

3

디렉토리와 파일을 참조하기 위해 문자열을 사용하기 때문에 실제로 코드가 슬그머니 나타납니다. 루트 디렉토리에서 DirectoryInfo를 사용하십시오. DirectoryInfo.GetFileSystemInfos()를 사용하여 FileSystemInfos의 목록을 가져옵니다. DirectoryInfo 객체를 재귀 적으로 호출하고 FileInfo 객체의 크기를 추가하기 만하면됩니다. 그것은 훨씬 빨라야합니다.

0

성능을 높이거나 시스템 응답 속도를 높이시겠습니까?

스파이더 링 응용 프로그램에 메시지 큐 루프를 주기적으로 실행하도록 지시하여 응답을 늘릴 수 있습니다. 화면 다시 그리기 등을 처리합니다. 이렇게하면 성능을 저하시키면서 진행을 업데이트 할 수 있습니다. CPU 우선 순위를 산출).

+0

모두! 나는 이런 응용 프로그램을 만든 적이 없으므로 일부 도움말/포인터를 찾고있다! 감사 –

0

이 가져 하위 디렉토리 :

string[] directories = Directory.GetDirectories(node.FullPath); 
        foreach (string dir in directories) 
        { 
         TreeNode nd = node.Nodes.Add(dir, dir.Substring(dir.LastIndexOf("\\")).Replace("\\", ""), 3); 
         if (showItsChildren) 
          ShowChildDirectories(nd, true); 
         size += GetDirectorySize(nd.FullPath); 
        } 

Thsi 카운트 파일 크기 : 여전히 디스크의 느린 경우

long b = 0; 

       // Get array of all file names. 
       string[] a = Directory.GetFiles(p, "*.*"); 

       // 2 
       // Calculate total bytes of all files in a loop. 
       foreach (string name in a) 
       { 
        // 3 
        // Use FileInfo to get length of each file. 
        FileInfo info = new FileInfo(name); 
        b += info.Length; 
        IncrementCount(); 
       } 
0

시도는, UI를 업데이트 모든 부분을 주석 I/당신이 할 수있는 일은 없으며, 더 빨라지면 UI 작업을 저장하기 위해 모든 X 파일을 UI로 업데이트 할 수 있습니다.

작업자 스레드에서 모든 작업을 수행하여 UI를 응답 가능하게 만들 수 있지만 약간 느려질 수 있습니다.

디스크 I/O가 상대적으로 느리며 다른 응용 프로그램 (스왑 파일, 임시 파일 ...)에서도 필요합니다. 또한 멀티 스레딩은 많은 도움이되지 않습니다. 모든 파일은 동일한 실제 디스크에 있으며 디스크 I/O가 병목 현상 일 가능성이 높습니다.

0

그냥 추측 할 수 있지만 실적에 영향을 미칠 수있는 것은 파일 스캔이 아니라 UI입니다. TreeNode를 생성하는 코드를 주석 처리하십시오.

시도하면 스캔을 완료 한 후 때까지 나무 페인트를하지합니다 :

은 모든 파일의 루트 트리 노드가 treey에 추가되지 않았는지 확인합니다. 모든 하위 항목을 추가 한 다음 처리가 끝나면 "최상위"노드를 추가하십시오. 어떻게 작동하는지보십시오.

1

background worker을 사용하여 작업을 수행하는 것이 좋습니다 ().아마도 사용할 수 없어야하는 컨트롤이 아니라는 것을 확인하고 싶을 것입니다. 그러나 사용할 수있는 것이 있으면 사용할 수 있습니다.

구글은 : http://www.google.com/search?q=background+worker

이 응용 프로그램이 멀티 스레드 다중 스레드의 복잡성의 일부 밖으로 할 수있다. 모든 것이 포장되어있어 사용하기 편리합니다.

관련 문제