【问题标题】:Why does my code not find directories为什么我的代码找不到目录
【发布时间】:2012-08-12 02:58:29
【问题描述】:

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

我正在编写一个程序来处理标题为“this.zip”的文件,这些文件通常直接位于名为“contents”的文件夹中。我正在尝试确定 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);
            }

【问题讨论】:

  • 你能仔细检查你发布的样本吗? GetDirectories 的方法签名是 Directory.GetDirectories(String)、Directory.GetDirectories(String, String) 和 Directory.GetDirectories(String, String, SearchOption)。
  • 对于我列出的有效代码,它与它看起来完全一样。
  • 您的代码查找空文件夹。
  • “*内容*”是什么?使用这个“内容\\”。并且在哪里 folder.GetFileSystemInfos().Length > 0
  • 您的代码工作正常。将长度>1 更改为长度>0

标签: c# winforms linq directory


【解决方案1】:

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试试看,值得!

【讨论】:

    【解决方案2】:

    这应该可行:

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

    【讨论】:

      猜你喜欢
      • 2019-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 2018-03-21
      • 1970-01-01
      • 2021-05-27
      • 2022-01-16
      相关资源
      最近更新 更多