C# 递增文件夹名称,如C中的5.0.0.x#

C# 递增文件夹名称,如C中的5.0.0.x#,c#,C#,我有一个文件夹~/ConfigurationDirectory。此文件夹中的子文件夹命名如下 5.0.0.1 5.0.0.2 5.0.0.3 ... 现在,要求是-以数字标识具有“最大”名称的文件夹,并创建该文件夹的副本。将新文件夹重命名为5.0.0.n+1(假设可用数字最大的文件夹为5.0.0.n) 我已经编写了识别最大命名文件夹的代码。此外,我已经写了代码,将做的文件夹和子文件夹的副本。我无法获取的是,如何获取新文件夹的名称,即5.0.0.n+1 我如何在C#中实现这一点?任何指针都足够

我有一个文件夹~/ConfigurationDirectory。此文件夹中的子文件夹命名如下

5.0.0.1
5.0.0.2
5.0.0.3
...

现在,要求是-以数字标识具有“最大”名称的文件夹,并创建该文件夹的副本。将新文件夹重命名为5.0.0.n+1(假设可用数字最大的文件夹为5.0.0.n)

我已经编写了识别最大命名文件夹的代码。此外,我已经写了代码,将做的文件夹和子文件夹的副本。我无法获取的是,如何获取新文件夹的名称,即5.0.0.n+1

我如何在C#中实现这一点?任何指针都足够了,而不是完成编码


谢谢

假设您使用的数字不是简单的由四部分组成的版本号,您需要使用字符串.Split()来分解文件夹名称,然后转换.ToInt32()或int.Parse()将最后一个块转换为数字。从这里开始,您增加它,然后使用类似string.Format()的内容将其转换回文件夹名称


但是,如果您确实使用的是简单的版本号,那么使用
系统.version
类(具体来说,是
Parse()
TryParse()
ToString()
方法)将是一个非常简单的实现,可应用于任意数量的元素:

  • 把线在点上分开。调用生成的数组
    a
  • 将a的最后一个元素转换为整数。调用这个整数
    i
  • i++
  • a[last]=i.ToString()
  • 使用点作为分隔符连接
    a
    的元素

  • 确保您的标识算法确实选择了数值最大的值:如果您有5.0.0.9和5.0.0.10,那么如果标识确实使用字母顺序,您将找到5.0.0.9。

    您可以使用
    string.LastIndexOf
    来实现此目的(这比使用
    string.Split要轻得多):


    更新:有人指出,鉴于存在以下问题,这种方法可能是过度的。对此,有几点回应:

  • Version.TryParse
    从.NET 4.0开始提供。许多开发人员没有使用.NET 4.0;因此,立即放弃任何替代方法(在我看来)是非常狭隘的
  • 还没有指出性能是否是一个很大的问题。大概不是。但是,当你从概念上考虑这个问题时,
    Version.TryParse
    实际上做了比我们在本例中需要做的多得多的工作:它正在查看版本字符串的每个单独组件,并将它们解析为一个complete对象。另一方面,上面概述的方法只需检查版本字符串的最后一部分,因此效率更高。我有:使用上述方法执行的时间约为使用
    version.TryParse
    所需时间的30%
  • 当然,可以公平地指出,如果一个人已经知道
    Version.TryParse
    并选择编写上述代码,那么他就会犯过早优化的错误。也就是说,假设你不知道,而你已经编写了上述代码。正确的做法是重构代码以使用
    Version.TryPar吗se
    ,保持相同的功能并将性能降低约200%?我不是在口头上问;也许在某些情况下,为了简单性和可维护性,可能是这样。但这将是一个判断
  • 我发表这些观点主要是为了反驳那些仅仅因为解决方案执行与“开箱即用”相同的任务而立即拒绝解决方案的人解决方案。有时,根据你的情况,你自己做一些事情是有意义的。只要知道你自己在做什么,并准备好退后一步,在合适的时候改变方向。

    使用系统;
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections;
    
    namespace ConsoleApplication1
    {
        static class Extensions
        {
            public static TOutput[] ToArray<TSource, TOutput>(this IEnumerable<TSource> col, Converter<TSource, TOutput> converter)
            {
                return Array.ConvertAll<TSource, TOutput>(col.ToArray(), converter);
            }
        }
    
        class Program
        {
    
            static void Main(string[] args)
            {
                string original = "5.0.0.0";
                int[] tmp = original.Split('.').ToArray<string, int>(new Converter<string, int>(delegate(string s)
                {
                    int result;
                    return int.TryParse(s, out result) ? result : 0;
                }));
    
                tmp[tmp.Length - 1]++;
                // re should contain 5.0.0.1
                string re = String.Join(".", tmp);
            }
        }
    }
    
    使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 使用系统集合; 命名空间控制台应用程序1 { 静态类扩展 { 公共静态TOutput[]ToArray(此IEnumerable列,转换器) { 返回Array.ConvertAll(col.ToArray(),converter); } } 班级计划 { 静态void Main(字符串[]参数) { 字符串original=“5.0.0.0”; int[]tmp=original.Split('.').ToArray(新转换器(委托)(字符串s) { int结果; 返回int.TryParse(s,out结果)?结果:0; })); tmp[tmp.Length-1]+; //re应包含5.0.0.1 string re=string.Join(“.”,tmp); } } }
    这是最正确的解决方案,国际海事组织:

    Version version;
    if (Version.TryParse("5.0.0.0", out version))
    {
        // your logic here
        return new Version(
             version.Major,
             version.Minor,
             version.Build,
             version.Revision + 1).ToString();
        // will return 5.0.0.1
    }
    else
    {
        // error handling here
    }
    

    迈克尔·马德森:没错,我的识别算法选择了5.0.0.9而不是5.0.0.10。我将不得不重新审视它。我没有15分来支持你的答案,但是,在我获得15票的那一天,我保证我会支持你的答案。谢谢!既然你可以使用
    System.Version.TryParse()
    ?;-)@STW:对于这种特殊情况,您可以使用System.Version,但如果您有5个元素,则无法使用。如果少于4,则需要访问版本结构的其他字段。“手动”操作更灵活,也更易于重用。我们还发现,
    System.Version.TryParse()
    是.NET 4的新版本,OP从未明确提到这些是版本号。如果你编辑你的帖子,我可以删除我的博客。谢谢你的完整代码。我写了一些类似的东西。既然可以使用
    System.Version.TryParse()
    ?;-),为什么还要这么做@STW:嗯。。。因为我做到了
    Version version;
    if (Version.TryParse("5.0.0.0", out version))
    {
        // your logic here
        return new Version(
             version.Major,
             version.Minor,
             version.Build,
             version.Revision + 1).ToString();
        // will return 5.0.0.1
    }
    else
    {
        // error handling here
    }