2012-08-12 3 views
0

를 찾을 수없는 ** 편집 : 그것은 내 코드가 실제로 어떤 일한다는 것을 지적하고있다. 그러나 'this.zip'파일을 하위 폴더로 식별하므로 'contents \ this.zip'인 모든 폴더가 나열됩니다. (단지 'contents \ newfolder \ this.zip'인 것을 찾으려고 노력하므로 적어도 하나의 'contents'디렉토리의 하위 폴더가 있습니다.) 어떻게하면 .zip 파일뿐만 아니라 실제 폴더 인 디렉토리 만 나열 할 수 있습니까?왜 내 코드 디렉토리

나는 일반적으로 직접 '컨텐츠'라는 폴더에있는 'this.zip'라는 제목의 파일을 다루는 프로그램을 쓰고 있어요. this.zip 파일이 'contents'폴더에 직접 있는지 또는 하위 폴더가 있는지 여부를 확인하려고합니다. 'contents'폴더가 비어 있는지 확인하기 위해 작동하는 코드 집합이 있는데 하위 디렉토리가 포함 된 'contents'폴더를 찾기 위해 변경할 수 있다고 생각했지만 작동하지 않습니다. 내가 쿼리 변경 한 경우

//This finds 'contents' folders that are empty 
      DirectoryInfo directory = new DirectoryInfo(txtbxOldFolder.Text); 
      DirectoryInfo[] folders = directory.GetDirectories("*contents*",SearchOption.AllDirectories);     

      Var query = from folder in folders 
         where folder.GetFileSystemInfos().Length == 0 
         select folder.FullName.ToString(); 
      foreach (string str in query) 
      { 
       //this adds the path of any empty 'contents' folder 
       listEmptyFolder.Add(str); 
      } 

내가 생각 - 문은 서브 디렉토리가 그 중 하나를 찾아 낼 길이> 1이 될,하지만 작동하지 않습니다. 이것이 제가 시도하고있는 것을 성취하는 최선의 방법입니까, 아니면 LINQ를 사용하려고 시도 할 것입니까?

//This is supposed to find 'contents' folders that have subdirectories, but it's unsuccessful 

      DirectoryInfo directory = new DirectoryInfo(txtbxOldFolder.Text); 
      DirectoryInfo[] folders = directory.GetDirectories("*contents*",SearchOption.AllDirectories);     

      Var query = from folder in folders 
         where folder.GetFileSystemInfos().Length > 1 
         select folder.FullName.ToString(); 
      foreach (string str in query) 
      { 
       //this adds the path of any empty 'Contents' folder 
       listNestedFolders.Add(str); 
      } 
+0

당신이 게시 된 샘플을 다시 한 번 확인 할 수 있나요? GetDirectories의 메소드 시그니처는 Directory.GetDirectories (String), Directory.GetDirectories (String, String) 및 Directory.GetDirectories (String, String, SearchOption)입니다. – jac

+0

내가 나열한 코드는 정확히 그대로 표시됩니다. –

+0

코드가 비어있는 폴더를 찾습니다. –

답변

2

Var는 var이어야하며 0보다 큰 값을 입력해야합니다. LinqPad에서 정상적으로 작동합니다. (이 물건을 테스트하는 것이 좋습니다.)

DirectoryInfo directory = new DirectoryInfo(txtbxOldFolder.Text); 
DirectoryInfo[] folders = directory.GetDirectories("*contents*",SearchOption.AllDirectories);     

var query = from folder in folders 
      where folder.GetFileSystemInfos().Length > 0 
      select folder.FullName.ToString(); 

다음은 내 모든 단계를 잘 보여주는 내 LinqPad 코드입니다.

void Main() 
{ 
    DirectoryInfo directory = new DirectoryInfo("D:\\test"); 
    DirectoryInfo[] folders = directory.GetDirectories(@"*.*",SearchOption.AllDirectories); 

    var query2 = from folder in folders 
       where folder.GetFileSystemInfos().Length > 0 
       select folder.FullName.ToString(); 

    folders.Select(f => f.GetFileSystemInfos()).Dump(); 
    query2.Dump(); 

    foreach (string str in query2) 
    { 
    Console.WriteLine(str); 
    } 
} 

LinqPad를 다운로드하여 사용해보세요.

0

이 작동합니다 :

public List<string> FindEmptyFolders(string FolderToSearchIn, string FolderNameToSearch, string FileExtension = "") 
    { 
     List<string> FolderList = System.IO.Directory.GetDirectories(FolderToSearchIn, "*" + FolderNameToSearch + "*", SearchOption.AllDirectories).ToList(); 
     List<string> EmptyFolders = new List<string>(); 
     if (string.IsNullOrEmpty(FileExtension)) 
      FolderList.ForEach(Folder => { if (System.IO.Directory.EnumerateFiles(Folder).Count() == 0) EmptyFolders.Add(Folder); }); 
     else 
      FolderList.ForEach(Folder => { if (System.IO.Directory.EnumerateFiles(Folder, "*." + FileExtension).Count() == 0) EmptyFolders.Add(Folder); }); 
     return EmptyFolders; 
    } 

사용법 :

foreach (string EmptyFolder in FindEmptyFolders(txtbxOldFolder.Text, "contents")) 
      MessageBox.Show(EmptyFolder); 
관련 문제