在C#中增加文件夹名称,例如5.0.0.x

时间:2010-08-30 16:24:09

标签: 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#中执行此操作?任何指针都足够而不是完整的编码。

谢谢!

5 个答案:

答案 0 :(得分:4)

假设您使用的数字不是简单的四部分版本号,您将要使用string.Split()来分解文件夹名称,然后使用Convert.ToInt32()或int .Parse()将最后一个块转换为数字。从那里,你递增它,然后使用像string.Format()这样的东西把它变回文件夹名。

但是,如果您确实使用的是简单版本号,那么使用System.Version类(特别是Parse()TryParse()ToString()方法)将是一个明显更直接的实现。

答案 1 :(得分:3)

您可以将string.LastIndexOf用于此目的(这比使用string.Split轻得多):

static string GetNextFolderName(string folderName)
{
    int lastDotPosition = folderName.LastIndexOf('.');
    string lastPartOfFolderName = folderName.Substring(lastDotPosition + 1);

    int number;
    if (int.TryParse(lastPartOfFolderName, out number))
    {
        number++;
        return folderName.Substring(0, lastDotPosition + 1) + number.ToString();
    }
    else
    {
        // You've got a problem on your hands, here.
        throw new FormatException();
    }
}

更新:有人指出,鉴于Version.TryParse的存在,这种方法可能过分。回答这几点:

  1. Version.TryParse自.NET 4.0起可用。许多开发人员不使用.NET 4.0;因此,放弃任何替代方法(在我看来)是非常狭隘的。
  2. 尚未表明表现是否令人担忧。据推测,事实并非如此。但是,当您从概念上考虑问题时,Version.TryParse实际上比我们在这种情况下需要的工作要多得多:它查看版本字符串的每个单独组件并将它们全部解析为完整的{{3}对象。另一方面,上面概述的方法只是难以检查版本字符串的最后部分,因此更有效。我有Version:使用上述方法在使用Version.TryParse的大约30%的时间内执行。
  3. 当然可以指出,如果一个人已经知道Version.TryParse并且选择编写上面的代码,那么就会因为过早的优化而感到内疚。也就是说,假设你知道它,并且已经写了上面的代码。正确的做法是重构代码以使用Version.TryParse,保持相同的功能并将性能降低约200%?我不是在反问;也许在某些情况下,为了简单和可维护性,它可能是。但这将是一次判断。
  4. 我发布这些要点主要是对任何立即解雇解决方案的人的反驳,因为它执行与“开箱即用”解决方案相同的任务。有时,根据您的具体情况,无论如何都可以自己做一些事情。只要知道自己正在做什么,并准备退后一步,在适当的时候改变方向。

答案 2 :(得分:3)

这是最正确的解决方案,imo:

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
}

答案 3 :(得分:0)

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);
        }
    }
}

答案 4 :(得分:-1)

这是一个简单的算法,可以应用于任意数量的元素:

  1. 在点上分割字符串。调用生成的数组a
  2. 将a的最后一个元素转换为整数。将此整数称为i
  3. i++
  4. a[last] = i.ToString()
  5. 使用点作为分隔符加入a的元素。
  6. 确保您的识别算法确实选择了数值最大的值:如果您有5.0.0.9和5.0.0.10,那么如果识别确实使用了字母顺序,您会找到5.0.0.9。