C# 如何查找嵌套太深的文件?

C# 如何查找嵌套太深的文件?,c#,winforms,linq,directory,C#,Winforms,Linq,Directory,我有一个父文件夹,其中包含多个名为Project-*(文件夹编号为Project-1、Project-15、Project-253等)的文件夹。每个文件夹中都有一个zip文件,名称始终相同“project.zip”。这意味着当文件夹结构正确时,它应该始终为TopFolder\Project-*\Project.zip 我正在尝试编写一个程序,查看每个Project-*文件夹,以查看Project.zip文件是否嵌套在另一个文件夹中(例如:Project-*\newfolder\Project.z

我有一个父文件夹,其中包含多个名为Project-*(文件夹编号为Project-1、Project-15、Project-253等)的文件夹。每个文件夹中都有一个zip文件,名称始终相同“project.zip”。这意味着当文件夹结构正确时,它应该始终为TopFolder\Project-*\Project.zip

我正在尝试编写一个程序,查看每个Project-*文件夹,以查看Project.zip文件是否嵌套在另一个文件夹中(例如:Project-*\newfolder\Project.zip)

我有一些代码,用于查找名为Projy-*的文件夹,如果它们有子目录,列出它们,但是它似乎把我的Proj.Zip文件当作文件夹,这样它就显示出所有的子目录。

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


            //finds folders nested in the folder
            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 Project-* folder with subdirectories
                listNestedFolder.Add(str);
            }
如上所述,上面的代码确实可以找到任何带有子目录的Project-*文件夹,但是它也可以找到任何属于Project-*\Project.zip的文件夹。如何让它停止将zip文件标识为目录

GetFileSystemInfo()
返回文件和文件夹。
您可能需要调用
GetDirectories()

为了获得更好的性能,您可以编写
where folder.EnumerateDirectories().Any()
GetFileSystemInfos()
同时返回文件和文件夹。
您可能需要调用
GetDirectories()


为了获得更好的性能,您可以编写
where folder.EnumerateDirectories().Any()

您可以尝试此逻辑来搜索嵌套文件或子目录结构中的任何其他差异:

        string topfolder = @"c:\temp\utils\";
        string filename = "project.zip";

        foreach (string dir in Directory.GetDirectories(topfolder, "Project-*", SearchOption.TopDirectoryOnly))
        {
            IEnumerable<string> files = Directory.GetFiles(dir, "*.*", SearchOption.TopDirectoryOnly).Select(f => Path.GetFileName(f));
            if (files.Count() > 1)
            #region if directory contains extra (unexpected) files
            {
                Console.WriteLine(string.Format("Directory {0} contains {1} files", dir, files.Count()));
            }
            #endregion if directory contains extra (unexpected) files

            if (!files.Contains(filename))
            {
                Console.WriteLine(string.Format("File is not found in {0}", dir));

                #region Searching for the file in depth

                files = Directory.GetFiles(dir, filename, SearchOption.AllDirectories);
                if (files.Count() > 0)
                {
                    Console.WriteLine("The file has been found too deep:");
                    foreach (string s in files)
                        Console.WriteLine(s);
                }

                #endregion Searching for the file in depth
            }

            #region Searching for extra (unexpected) subdirectories

            int dircount = Directory.GetDirectories(dir, "*.*", SearchOption.TopDirectoryOnly).Length;
            if (dircount > 0)
                Console.WriteLine(string.Format("Directory {0} contains {1} subdirectories", dir, dircount));

            #endregion Searching for extra (unexpected) subdirectories
        }

        Console.ReadLine();
string topfolder=@“c:\temp\utils\”;
字符串filename=“project.zip”;
foreach(Directory.GetDirectories中的字符串dir(topfolder,“Project-*”,SearchOption.TopDirectoryOnly))
{
IEnumerable files=Directory.GetFiles(dir,“**”,SearchOption.TopDirectoryOnly)。选择(f=>Path.GetFileName(f));
如果(files.Count()>1)
#如果目录包含额外(意外)文件,则为区域
{
WriteLine(string.Format(“目录{0}包含{1}个文件”,dir,files.Count());
}
#如果目录包含额外(意外)文件,则为endregion
如果(!files.Contains(文件名))
{
WriteLine(string.Format(“在{0}中找不到文件”,dir));
#深入搜索文件的区域
files=Directory.GetFiles(dir、filename、SearchOption.AllDirectories);
如果(files.Count()>0)
{
WriteLine(“发现文件太深:”);
foreach(文件中的字符串s)
控制台。写入线(s);
}
#endregion深入搜索文件
}
#区域搜索额外(意外)子目录
int dircount=Directory.GetDirectories(dir,“**”,SearchOption.TopDirectoryOnly).Length;
如果(dircount>0)
WriteLine(string.Format(“目录{0}包含{1}子目录”,dir,dircount));
#endregion搜索额外(意外)子目录
}
Console.ReadLine();

您可以尝试此逻辑来搜索嵌套文件或子目录结构中的任何其他差异:

        string topfolder = @"c:\temp\utils\";
        string filename = "project.zip";

        foreach (string dir in Directory.GetDirectories(topfolder, "Project-*", SearchOption.TopDirectoryOnly))
        {
            IEnumerable<string> files = Directory.GetFiles(dir, "*.*", SearchOption.TopDirectoryOnly).Select(f => Path.GetFileName(f));
            if (files.Count() > 1)
            #region if directory contains extra (unexpected) files
            {
                Console.WriteLine(string.Format("Directory {0} contains {1} files", dir, files.Count()));
            }
            #endregion if directory contains extra (unexpected) files

            if (!files.Contains(filename))
            {
                Console.WriteLine(string.Format("File is not found in {0}", dir));

                #region Searching for the file in depth

                files = Directory.GetFiles(dir, filename, SearchOption.AllDirectories);
                if (files.Count() > 0)
                {
                    Console.WriteLine("The file has been found too deep:");
                    foreach (string s in files)
                        Console.WriteLine(s);
                }

                #endregion Searching for the file in depth
            }

            #region Searching for extra (unexpected) subdirectories

            int dircount = Directory.GetDirectories(dir, "*.*", SearchOption.TopDirectoryOnly).Length;
            if (dircount > 0)
                Console.WriteLine(string.Format("Directory {0} contains {1} subdirectories", dir, dircount));

            #endregion Searching for extra (unexpected) subdirectories
        }

        Console.ReadLine();
string topfolder=@“c:\temp\utils\”;
字符串filename=“project.zip”;
foreach(Directory.GetDirectories中的字符串dir(topfolder,“Project-*”,SearchOption.TopDirectoryOnly))
{
IEnumerable files=Directory.GetFiles(dir,“**”,SearchOption.TopDirectoryOnly)。选择(f=>Path.GetFileName(f));
如果(files.Count()>1)
#如果目录包含额外(意外)文件,则为区域
{
WriteLine(string.Format(“目录{0}包含{1}个文件”,dir,files.Count());
}
#如果目录包含额外(意外)文件,则为endregion
如果(!files.Contains(文件名))
{
WriteLine(string.Format(“在{0}中找不到文件”,dir));
#深入搜索文件的区域
files=Directory.GetFiles(dir、filename、SearchOption.AllDirectories);
如果(files.Count()>0)
{
WriteLine(“发现文件太深:”);
foreach(文件中的字符串s)
控制台。写入线(s);
}
#endregion深入搜索文件
}
#区域搜索额外(意外)子目录
int dircount=Directory.GetDirectories(dir,“**”,SearchOption.TopDirectoryOnly).Length;
如果(dircount>0)
WriteLine(string.Format(“目录{0}包含{1}子目录”,dir,dircount));
#endregion搜索额外(意外)子目录
}
Console.ReadLine();

值得注意的是,您应该使用GetDirectory(如下面的答案),但是如果您想从列表中排除ZIP,您可以使用
&&(folder.Attributes&System.IO.FileAttributes.Archive)==0
值得注意的是,您应该使用GetDirectory(如下面的答案),但是如果您想从列表中排除ZIP,可以使用
&(folder.Attributes&System.IO.FileAttributes.Archive)==0