0

**編集:私のコードは実際に一種の仕事をしていることが指摘されています。ただし、「this.zip」ファイルはサブフォルダーとして識別されるため、「contents \ this.zip」であるフォルダーがリストされますが、これは私が望むものではありません。('contents \ newfolder \ this.zip'であるものだけを見つけようとしているので、'contents'ディレクトリの少なくとも1つのサブフォルダがあります)。.zipファイルだけでなく、実際のフォルダであるディレクトリのみを一覧表示するにはどうすればよいですか?

私は「this.zip」というタイトルのファイルを処理するプログラムを書いています。これらのファイルは通常、「contents」というフォルダーに直接配置されています。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);
            }

クエリを変更した場合、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);
            }
4

2 に答える 2

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 をダウンロードして試してみてください。

于 2012-08-12T03:20:29.647 に答える
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);
于 2012-08-12T04:08:36.267 に答える