2012-08-12 69 views
0

**编辑: 有人指出我的代码并不实际的工作内容。但它标识“this.zip”文件作为一个子文件夹,所以这是列出这不是我想要的“内容\ this.zip”的任何文件夹。 (试图找到那些'contents \ newfolder \ this.zip',所以'content'目录至少有一个子文件夹)。我怎样才能让它只列出实际文件夹的目录,而不仅仅是.zip文件?为什么我的代码找不到目录

我写一个程序,有标题为它们通常直接位于一个名为“内容”文件夹中的“this.zip”文件交易。我正在尝试确定this.zip文件是否直接位于“内容”文件夹中,或者是否存在其中的子文件夹。我有一组代码,正在努力确定“内容”文件夹是空的,我以为我可以改变它来查找包含子目录任何“内容”的文件夹,但它不工作。

//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); 
      } 

我想如果我改变了查询 - where语句是一个长度> 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 2012-08-12 03:10:05

+0

对于我列出的工作代码,它看起来完全一样。 – 2012-08-12 03:13:57

+0

你的代码找到空的文件夹。 – 2012-08-12 03:16:57

回答

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); 
相关问题