В исходном коде вы делаете проверку только один раз. Попробуйте (обратите внимание на 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";
Update: Как @eFloh показано (см комментарии), может возникнуть проблема, когда два экземпляра вышеуказанного кода работают одновременно.
Это связано с тем, что между циклом и фактической операцией write-to-disk существует небольшое окно, поэтому другой процесс может просто попасть в середину и записать файл с тем же именем, перезаписывая файл, создаваемый другой программой или возникновения ошибок.
Одним из возможных решений является запись специального файла в каталог при выполнении цикла (и остановка выполнения - такой файл существует), чтобы гарантировать отсутствие конфликтов между двумя работающими экземплярами.
По существу, этот файл будет сигнализировать программе о том, что другая программа выполняет этот цикл, поэтому другая программа должна ждать, пока другой не завершится.
Объяснение кода ниже:using
блок пытается создать файл с именем lock_file
в каталоге.
FileMode.OpenOrCreate
позволяет открывать файл (если он уже существует) или создавать его (если это не так).
FileAccess.Write
делает можно написать 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
}
Используйте 'std :: to_string (count)'. –
Вы также устарели, чтобы проверить 'if (File.Exists (filename))' после цикла в вашем цикле for. Когда это будет ложно, вам нужно выйти из цикла. – NathanOliver
Почему бы не создать «новое руководство» для каждого файла? – Max