我的文件名格式如下:
时间戳的用户名 - 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)。但是我的新问题是如何在文件名
的末尾附加它答案 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。