【问题标题】:C# Find All SubFolders That Contain StringC#查找所有包含字符串的子文件夹
【发布时间】:2018-01-31 06:50:28
【问题描述】:

编辑 - 修改了我的帖子标题,使其与问题更相关。

我的文件夹可能包含也可能不包含以“REV”开头的子文件夹。如果有以“REV”开头的子文件夹,则后面跟一个用前导零填充的整数值。 (即:REV010 或 REV003)。

我的目标是:

  1. 找到测试文件夹(C:\temp\TEST\REV003)
  2. 读取文件夹的字符串名称并解析其整数值
  3. 将整数添加到整数列表中。查找最大整数值
  4. 增加最大整数值
  5. 创建以“REV”开头并填充新 int 值的新字符串文件夹名称

当我调试代码时(如下),它似乎找不到 REV003 文件夹(该文件夹肯定存在于路径中)。

查找文件夹时我的 LINQ 语句有问题吗?

另外,如果有更简单的程序来实现相同的目标 - 我绝对愿意!谢谢!

        int nextRev = 0;

        List<int> listOfRevs = new List<int>();

        IEnumerable<string> revFolders = Directory.GetDirectories(destDirName, "*REV*", SearchOption.AllDirectories).Where(f => f.StartsWith("REV"));

        foreach (var rev in revFolders)
        {
            Console.WriteLine(int.Parse(rev.Replace("REV", "")));
            listOfRevs.Add(int.Parse(rev.Replace("REV", "")));
        }

        if (listOfRevs.Count > 0)
        {
            nextRev = listOfRevs.Max();
            Console.WriteLine(nextRev);
            nextRev++;
        }

        revFolder = "REV" + nextRev.ToString("000");

        Console.WriteLine("New Folder: " + revFolder);

** 更新 ** 多亏了 NetMage,问题得到了解决,但是我仍然有一些错误。这是工作代码:

    string revf = "";
    int nextRev = 0;
    List<int> listOfRevs = new List<int>();

    IEnumerable<string> revFolders = Directory.GetDirectories(destDirName, "REV*", SearchOption.AllDirectories);

    foreach (var rev in revFolders)
    {
        if (rev.Contains("REV"))
        {
            revf = rev.Split('\\').Last();
            listOfRevs.Add(int.Parse(revf.Replace("REV", "")));
        }
    }

    if (listOfRevs.Count > 0)
    {
        nextRev = listOfRevs.Max();
        nextRev++;
    }

    revFolder = "REV" + nextRev.ToString("000");

【问题讨论】:

  • 您从GetDirectories 返回的信息包括完整路径,因此它们不以“REV”开头。另外,为什么不使用 "REV*" 作为您的模式并跳过 LINQ?

标签: linq


【解决方案1】:

将您的目录搜索更改为

IEnumerable<string> revFolders = Directory.GetDirectories(destDirName, "REV*", SearchOption.AllDirectories);

根据此结果,您将更改最大查找代码 - 我将使用 LINQ:

var maxREV = Directory.GetDirectories(destDirName, $"REV*", SearchOption.AllDirectories)
                    .Select(d => Int32.TryParse(Path.GetFileName(d).Substring(3), out int num) ? num : (int?)null)
                    .Where(n => n.HasValue)
                    .Select(n => n.Value)
                    .Max();

var revFolder = "REV" + (maxREV+1).ToString("000");

Console.WriteLine("New Folder: " + revFolder);

我进行了一些错误处理以跳过“REV”之后没有整数的文件。

【讨论】:

  • 谢谢。就是这样。下面还有一些错误,我将更新我的帖子
  • 我更新了我的答案,完整执行了你的任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2012-07-04
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
相关资源
最近更新 更多