自动递增文件名

时间:2009-01-13 05:56:00

标签: c# string

我的文件名格式如下:

时间戳的用户名 - 1

此文件一直在写入,但在它变得太大之前我想创建一个新文件。

时间戳的用户名-2

如何使用最少的内存(即没有或很少的变量)来实现这一点

这是我的版本:

        private void Split() {
            char[] strArr = FlowArgs.Filename.ToCharArray();
            int num;
            //get the last number
            if(Int32.TryParse(strArr[strArr.Length - 1].ToString(), out num)) {
                num += 1;
            }
            //replace the old number with the new number
            char.TryParse(num.ToString(), out strArr[strArr.Length - 1]);
            FlowArgs.Filename = strArr.ToString();

        }

编辑: 我在FlowArgs类中添加了“version”属性(int)。但是我的新问题是如何在文件名

的末尾附加它

4 个答案:

答案 0 :(得分:5)

我认为你应该将计数器存储在一个int中。我知道你想节省内存空间但说实话,额外的int实际上是在“可接受的”类别中。我的意思是,Int32解析器可能浪费了更多的内存。不要忘记在x86上,内存空间被分配到4096字节页面,因此浪费的内存比这4个字节多得多。

编辑:您可能希望在类中使用类似GetNextFileName()的方法来生成下一个文件名(能够将代码重构为小位非常重要,比保存更重要记忆空间):

private int nextFileNumber = 0;

private string GetNextFileName(string userName)
{
    return String.Format("{0}-{1}-{2}", DateTime.Now, userName,
       nextFileNumber++);
}

答案 1 :(得分:2)

“最少内存量”不等于“无或少量变量”

局部变量本身只占用很少的内存。 但是堆中的对象创建需要更多,并且它们需要GC进行清理。

在您的示例中,ToCharArray()和ToString()创建了4个对象(不包括间接创建的对象)。

答案 2 :(得分:1)

你的字符串变量已经是字符数组:

    int num=0;
    //get the last number
    if (Int32.TryParse(FolwArgs.Filename[FolwArgs.Filename.Length-1].ToString(), out num))
        num++;
    //replace the old number with the new number
    char.TryParse(num.ToString(), out FolwArgs.Filename[FolwArgs.Filename.Length-1]]);

答案 3 :(得分:1)

不要使用正在运行的计数器,而应考虑使用datetime of creation作为文件名的更改部分。这样,您就不必存储和检索以前的值。 使用ToBinary()方法,您可以获得时间的数字表示。 当然,可以使用文件名中可接受的任何time format - 请参阅custom date and time format strings