我正在使用C#WPF应用程序,该应用程序执行一些数据处理并以.csv
格式输出文件。我想要实现的是,每次我的程序运行时,它都会生成一个test.csv
输出文件,但是当我再次使用新数据运行时,新的结果文件将覆盖旧的文件。因此,我正在尝试做一些事情,以使每个创建的文件名都是唯一的。例如,,test.csv
然后test1.csv
,test2.csv
等等。我想出了以下代码段,但我认为逻辑不正确,因此我不知道该怎么做。任何帮助将不胜感激!
filename = "C:\\test.csv";
if (File.Exists(filename))
{
int count = 0;
for (int i = 0; i < 10; i++)
{
filename = "C:\\test" + count + ".csv";
count++;
}
}
在原始代码中,只执行一次检查。试试(注意while
):
filename = "C:\\test.csv";
int count = 0;
while (File.Exists(filename))
{
count++;
filename = "C:\\test" + count + ".csv";
}
//save file goes here
如果愿意,可以while
使用以下for
循环替换:
for(int count = 0; File.Exists(filename); count++)
filename = "C:\\test" + count + ".csv";
更新:如@eFloh所示(请参阅注释),当上述代码的两个实例同时工作时,可能会出现问题。
这是因为循环和实际的写磁盘操作之间有一个小窗口,因此其他进程可能只是进入中间并以相同的名称写入文件,从而覆盖了另一个程序正在创建的文件或导致错误。
一种可能的解决方案是在循环执行时(并且停止执行该文件)将特殊文件写入目录,以确保没有两个正在运行的实例发生冲突。
本质上,此文件将向程序发出信号,表明另一个程序正在执行此循环-因此,另一个程序应等待,直到另一个程序终止。
下面的代码解释:该using
块正在尝试创建lock_file
目录中的文件。
FileMode.OpenOrCreate
就可以打开文件(如果已经存在)或创建文件(如果不存在)。FileAccess.Write
make可以写lock_file
FileShare.Read
使得使用等待的,直到交了罚款,关闭其他进程-所以在需要时程序将等待。FileOptions.DeleteOnClose
使using
块删除lock_file
出口。这是非常重要的,因为否则,lock_file
它将永久保留在那里,从而使该块永远等待删除该文件。总结一下(同样,这部分的功劳归@eFloh):
using(new FileStream("C:\\lock_file", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read, 4096, FileOptions.DeleteOnClose))
{
//loop and saving goes here
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句