【问题标题】:Searching through a file structure to count items in a subfolder搜索文件结构以计算子文件夹中的项目
【发布时间】:2012-12-10 15:30:56
【问题描述】:

我在尝试通过搜索文件结构来创建列表时遇到问题。正在尝试制作一个可以运行并执行此操作的基本 c# 控制台程序。

我的结构是这样组织的。

我的网络\
X1\ 用户\ (很多很多用户文件夹)\ 搜索特定的子文件夹 \ 在此子文件夹中的任何文件夹的文本文件中列出一个列表

所以我必须能够搜索每个用户文件夹,然后检查一个文件夹(每次都相同)然后使用以下格式列出该子文件夹中找到的文件夹

用户名(用户文件夹的名称)>>特定文件夹中的文件夹名称。

已经很长时间了,因为我不得不尝试在文件结构中进行任何搜索,所以对此非常空白。

**************** 编辑!!!!!

感谢您的信息和链接。现在正在研究这个,但想知道这是否有意义并且会起作用。在我确定它看起来不会搞砸之前,不想只是测试它。

            TextWriter outputText = new StreamWriter(@"C:\FileList.txt", true);
        outputText.WriteLine("Starting scan through user folder");
        string path = @"\\X1\users";
        string subFolder = "^^ DO NOT USE - MY DOCS - BACKUP ^^";
        string [] user_folders = Directory.GetDirectories(path);

        foreach (var folder in user_folders)
        {
            string checkDirectory = folder + "\\" + subFolder;

            if (Directory.Exists(checkDirectory) == true)
            {
                string [] inner_folders = Directory.GetDirectories(checkDirectory);
                foreach (var folder2 in inner_folders)
                {
                    outputText.WriteLine(folder2);
                }
            }
        }
        outputText.WriteLine("Finishing scan through user folder");
        outputText.Close();

已修复并正常工作!!!!必须更改字符串 [] 行,使其成为 .GetDirectories 而不是 .GetFiles!

【问题讨论】:

  • 查看DirectoryDirectoryInfo 课程,它们应该会对您有所帮助。
  • 我相信我在下面发布的第二种方法会比手动遍历所有用户更快
  • 我修改后的代码显然根本不起作用。我认为这可能是我的原始路径未被引用。此路径位于随机网络驱动器上。编辑我现在拥有的内容。

标签: c# file-structure


【解决方案1】:

正如 Bali C 所提到的,Directory 类将成为你的朋友。以下示例应该可以帮助您入门。

发件人:http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvcs/thread/3ea19b83-b831-4f30-9377-bc1588b94d23/

//Obviously you'll need to define the correct path.
string path = @"My Network\X1\Users\(many many user folders)\Search for a specific sub folder \";

// Will Retrieve count of all files in directry and sub directries
int fileCount = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Length; 

// Will Retrieve count of all files in directry but not sub directries
int fileCount = Directory.GetFiles(path, "*.*", SearchOption.TopDirectory).Length; 

// Will Retrieve count of files .txt extensions in directry and sub directries
int fileCount = Directory.GetFiles(path, "*.txt", SearchOption.AllDirectories).Length; 

如果您需要在 /Users/ 文件夹中搜索某些人或某些条件,您可以执行以下操作:

string path = @"PATH_TO_USERS_DIRECTORY";
string [] user_folders = Directory.GetFiles(path);
foreach(var folder in user_folders)
{
    if folder == "MyFolder";
        Process(folder);  //Search the directory here.
}

【讨论】:

  • 是否可以将通配符值放入路径字段?还是我必须去搜索用户..然后为用户中的每个文件执行搜索特定文件夹。然后每个人列出该文件夹中的文件夹?
  • 如果您只是想浏览 /Users/ 中的所有文件夹,您可以使用“SearchOption.AllDirectories”选项。如果您正在寻找特定用户或想要过滤某些用户,您可以获取 /Users/ 中的所有文件并遍历它们,只搜索您想要的那些。我会将其附加到答案中。
  • 感谢您的信息,我发布了对我的原始问题的编辑(因为显然我还不能回答我自己的问题)到目前为止我所拥有的,不确定它是否有意义或者我是否正在写作这是我想要的方式。
【解决方案2】:

尝试以下实现。这只会写入控制台:

const string root = "<<your root path>>";
const string directoryToLookFor = "<<the folder name you are looking for>>";
foreach (var directory in Directory.EnumerateDirectories(root, "*.*", SearchOption.TopDirectoryOnly))
{
    var foundDirectory = Directory.EnumerateDirectories(directory, directoryToLookFor, SearchOption.TopDirectoryOnly).FirstOrDefault();
    if (!String.IsNullOrEmpty(foundDirectory))
    {
        var filesInside = Directory.GetFiles(foundDirectory);
        foreach (var file in filesInside)
        {
            Console.WriteLine(file);
        }
    }
}

或者你可以这样做:

foreach (var foundDirectory in Directory.EnumerateDirectories(root, directoryToLookFor, SearchOption.AllDirectories))
{
    var filesInside = Directory.GetFiles(foundDirectory);
    foreach (var file in filesInside)
    {
        Console.WriteLine(file);
    }
}

这将在所有子目录中搜索,而无需遍历用户的文件夹。

【讨论】:

  • 哦,在我自己完成之前没有看到这个。再次阅读上面的评论,并认为这是另一个人的帖子。页面中间的添加我只是没有走到它下面。如果我像我必须为我的那样更改文件查找到目录,我相信这也会起作用。
  • 哦,我明白了。好吧,我在上面粘贴的这段代码有效(至少在我所做的基本测试中),看看它是否有用。
猜你喜欢
  • 2012-10-28
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 2017-11-14
  • 2014-07-09
  • 2018-03-11
  • 2020-09-11
  • 1970-01-01
相关资源
最近更新 更多