spa*_*a93 2 .net c# wpf filenames unique
我正在开发一个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++;
}
}
Run Code Online (Sandbox Code Playgroud)
在原始代码中,您只进行一次检查.试试(注意while):
filename = "C:\\test.csv";
int count = 0;
while (File.Exists(filename))
{
count++;
filename = "C:\\test" + count + ".csv";
}
//save file goes here
Run Code Online (Sandbox Code Playgroud)
如果您愿意,可以while使用此for循环替换:
for(int count = 0; File.Exists(filename); count++)
filename = "C:\\test" + count + ".csv";
Run Code Online (Sandbox Code Playgroud)
更新:正如@eFloh指出的那样(请参阅注释),当上述代码的两个实例同时工作时可能会出现问题.
这是因为循环和实际的写入磁盘操作之间有一个小窗口,因此其他进程可能只是在中间并写入一个具有相同名称的文件,覆盖其他程序正在创建或导致错误的文件.
一种可能的解决方案是在循环执行时将特殊文件写入目录(并暂停执行此类文件存在)以确保没有两个正在运行的实例发生冲突.
本质上,该文件将向程序发出另一个程序正在执行此循环的信号 - 因此另一个程序应该等到另一个程序终止.
下面的代码说明:该using块正在尝试创建目录中调用lock_file的文件.
FileMode.OpenOrCreate使得打开文件(如果已经存在)或创建文件(如果不存在)成为可能.FileAccess.Write作是可以写的lock_fileFileShare.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
}
Run Code Online (Sandbox Code Playgroud)