【问题标题】:获取具有“最大索引”的文件夹
【发布时间】:2022-01-23 12:19:24
【问题描述】:

我有一个关于 .net 代码的项目,我正在处理文件。

我有很多文件夹,命名约定是这样的:

pdf(1)
pdf(2)
pdf(3)
pdf(4)
pdf(5)

我要做的是当我插入一个新文件夹时,它的新名称应该是(# of folders that exist+ 1) 这段代码做得很好:

 string FileDirectory = "C\\test\\myfiles\\";
 string FileName = "pdf";
 DirectoryInfo hdDirectoryInWhichToSearch = new DirectoryInfo(FileDirectory);

            FileSystemInfo[] filesAndDirs = hdDirectoryInWhichToSearch.GetFileSystemInfos("*" + FileName + "*");
            int i = filesAndDirs.Length;
            
            if (i>0)
            {
                    i++;
                    Directory.CreateDirectory(FileDirectory + '\\' + FileName+ "(" + i + ")");
            }

现在,虽然这段代码可以正常工作,但在这种情况下它不能正常工作。 例如,现有文件是:

pdf(1)
pdf(2)
pdf(5)
pdf(6),

它将尝试创建一个新文件夹,(文件夹数 + i),这将是“pdf(5)”但“pdf(5)”已经存在!

现在我的问题是:如何在这个例子中获得现有文件夹 (6) 的最高“索引”,并创建一个新文件夹 pdf(6)+1 ?

【问题讨论】:

  • 循环遍历,拆分出数字部分。或者use regex^.*?\((\d+)\)$ 来捕获号码。
  • 你想要那个文件夹名称的高度索引吗?
  • @ZoyebShaikh,如果可能的话,是的。然后我会比较它并取它的最大值,然后就是“maximumim + 1”。
  • @Llama,你能给我至少一个伪代码吗?
  • 遍历目录。如果目录包含( 并以) 结尾,则将( 之前的目录名称作为“根”。使用SubstringIndexOfLastIndexOf等将数字部分剪掉。如果该数字高于该目录最后记录的数字,则保存它。如果没有(,则假设为 1 并存储它。遍历所有目录后,您应该拥有每个目录的“根”和最高编号。如果仍然感到困惑,请尝试在纸上弄清楚您将如何做。

标签: c# asp.net file directory


【解决方案1】:
using System.Collections.Generic;
using System.Linq;
 

namespace ConsoleApp
{
    public class Program
    {
        public static void Main()
        {

            List<string> files = new List<string>{"pdf(1)","pdf(2)","pdf(3)"};
            List<string> nums = new List<string>();


            foreach (var file in files)
            {
                var str = file.Substring(file.IndexOf("(")).Replace(")","").Replace("(","");
                nums.Add(str);
            }


            var fileNums =  nums.ConvertAll(x=>x);
            var lastfileNo = fileNums.OrderByDescending(x => x).FirstOrDefault();

        }

    }

}

可能还有其他方法

首先遍历文件并将其存储到字符串列表中 然后将所有转换为int,如果您不想转换,那很好 然后按降序排列,找到第一个

【讨论】:

  • 有道理,但我的文件名并不总是“pdf(1),pdf(2),pdf(3)”。如何动态制作,例如:List&lt;string&gt; files = new List&lt;string&gt;{FileName"}; ?我的意思是,将所有创建的文件夹存储在一个列表中,而不是将它们的名称静态地放在一个列表中。
  • 您必须使用 System.IO 命名空间和类来获取所有文件名称,您要我也提供这些代码吗?
  • 您的问题是“我怎样才能获得现有文件夹中最高的“索引”(6)”所以这就是您可以获得最高索引的方法,不是吗?
  • 嗯,是的,关于如何实现这一点实际上是一个非常好的主意,而且效果很好。现在我只需要一个循环来将我创建的所有文件夹存储在列表中。我会尽力解决这个问题。
  • ZoeybShaikh 你知道为什么this 循环不起作用吗?它返回一个空数组。
猜你喜欢
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 2013-03-04
  • 2021-07-19
  • 2017-03-03
  • 1970-01-01
  • 2020-05-08
相关资源
最近更新 更多