【问题标题】:Create sequential folder names using C# and .NET 2.0?使用 C# 和 .NET 2.0 创建顺序文件夹名称?
【发布时间】:2012-08-29 00:39:32
【问题描述】:

我需要创建数量增加的备份文件夹。但是如果存在编号间隙,我需要跳过它们,并使下一个文件夹名称比编号最高的文件夹高一个。例如,如果我有:

c:\backup\data.1
c:\备份\数据.2
c:\备份\数据.4
c:\backup\data.5

我需要下一个文件夹

c:\backup\data.6

下面的代码有效,但感觉非常笨拙。有没有更好的方法来做到这一点并且仍然保留在 .NET 2.0 中?

    static void Main(string[] args)
    {
        string backupPath = @"C:\Backup\";
        string[] folders = Directory.GetDirectories(backupPath);
        int count = folders.Length;
        List<int> endsWith = new List<int>();

        if (count == 0)
        {
            Directory.CreateDirectory(@"C:\Backup\Data.1");
        }
        else
        {
            foreach (var item in folders)
            {
                //int lastPartOfFolderName;
                int lastDotPosition = item.LastIndexOf('.');
                try
                {
                    int lastPartOfFolderName = Convert.ToInt16(item.Substring(lastDotPosition + 1));
                    endsWith.Add(lastPartOfFolderName);
                }
                catch (Exception)
                {
                   // Just ignore any non numeric folder endings
                }
            }
        }

        endsWith.Sort();

        int nextFolderNumber = endsWith[endsWith.Count - 1];
        nextFolderNumber++;

        Directory.CreateDirectory(@"C:\Backup\Data." + nextFolderNumber.ToString());
    }

谢谢

【问题讨论】:

  • 您在命名上有灵活性吗?如果您的文件夹是backup.000001、backup.000002,您可以进行字符串排序,并轻松获取最大值。
  • 对于“最后一个”,没有必要保留一个集合。另外,我更喜欢TryParse 而不是捕获异常..
  • 如果删除了“Backup.3”,您希望发生什么?您要填写还是跳过?

标签: c# .net directory


【解决方案1】:

这是一个略有不同的版本,但基本上做的是相同的事情。找到带有 max 后缀的文件夹,然后为下一个文件夹添加一个。

     static void Main(string[] args)
    {
        string backupPath = @"C:\Backup\";
        string[] folders = Directory.GetDirectories(backupPath);
        Int16 max = 0;

        foreach (var item in folders)
        {
            //int lastPartOfFolderName;
            int lastDotPosition = item.LastIndexOf('.');

            if (lastDotPosition > -1 && !item.EndsWith("."))
            {
                Int16 folderNumber;

                if (Int16.TryParse(item.Substring(lastDotPosition + 1), out folderNumber))
                {
                    if (folderNumber > max)
                    {
                        max = folderNumber;
                    }
                }
            }
        }

        max++;
        Directory.CreateDirectory(@"C:\Backup\Data." + max);
    }

我只是稍微“清理”了您的代码以删除空捕获和附加列表/排序。

【讨论】:

  • 哇,看起来好多了。谢谢!
【解决方案2】:

你是对的;这有点笨拙。它依赖于操作系统以数字顺序提供文件夹名称,这是我一直警惕的,因为我无法控制新版本的操作系统会做什么。

您最好解析文件夹名称,获取所有数字的列表,然后明确找到最大值。

然后,当您添加 1 时,您保证您现在已经创建了新的最高值。

【讨论】:

  • 嗯,我认为这与其说是“笨拙”,不如说是一个“错误”。这似乎是按最大值查找的意图,但是..
猜你喜欢
  • 1970-01-01
  • 2021-12-10
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 2014-02-15
  • 1970-01-01
  • 2015-01-02
相关资源
最近更新 更多