2016-06-16 1 views
1

Как мой код в настоящее время написан, он изменит имя файла на текущую дату, а затем переместит его в завершенную папку в подкаталоге. Все работает отлично.Как получить добавочное значение, чтобы сохранить его счет

То, что я пытаюсь реализовать, это возможность переименовать его с разными номерами, если есть дубликаты. В принципе, если файл уже существует в завершенной папке, он переименует его «дата» (1) .csv.

Моя проблема в том, что, поскольку i установлен в 1, даже если я увеличиваю i, он сбрасывает его обратно на 1. Я просто хочу, чтобы он удерживал увеличиваемое значение во время работы кода. если в папке, из которой она извлекается три файла, я хочу, чтобы они обозначали их «дата», «дата» (1) и «дата» (2). Затем, если код снова запустится завтра, он начнет отсчет. Скорее всего, мой код никогда не будет иметь больше одного файла в папке. Я хочу реализовать это как безопасность. Если по какой-либо причине в папке содержится более одного файла, я хочу, чтобы мой код еще мог работать.

Это то, что я до сих пор:

int i = 1; 
var newFileName = DateTime.Now.ToString("MMddyyyy") + ".csv"; 
destinationPath = Path.Combine(GenesisDirectory, "Completed"); 
Directory.CreateDirectory(destinationPath); 
var destinationFileName = Path.GetFileName(newFileName); 

destinationPath = Path.Combine(destinationPath, destinationFileName); 

if (File.Exists(destinationPath)) 
{ 
    newFileName = DateTime.Now.ToString("MMddyyyy") + "(" + i + ")" + ".csv"; 
    destinationFileName = Path.GetFileName(newFileName); 
    var Dironly = Path.GetDirectoryName(destinationPath); 
    destinationPath = Path.Combine(Dironly, destinationFileName); 
    i++; 
} 

File.Move(inputFile, destinationPath); 
+0

Как сбросить 'i' до' 1'? Если вы используете этот код более одного раза, вы каждый раз объявляете новый 'int i = 1;' каждый раз. Возможно, переместить переменную в другую область? – David

+0

Вам нужно сохранить этот счетчик где-нибудь. –

+0

Я бы просто хотел сказать, что ваш нынешний подход абсолютно прекрасен. Он будет работать каждый раз, и если он будет работать только пару раз в день, слегка уменьшенная производительность не имеет значения. – Sphinxxx

ответ

0

Вы можете сделать свой счетчик статический, так что сохраняется между вызовами. Вам нужно будет переместить его из любого метода, в котором он находится, чтобы сделать это. Есть лучшие способы сделать это, но вы несколько ограничили объем решений, не предоставляя больше своего кода.

+0

Этот фрагмент кода является частью гораздо большей функции, которая анализирует данные csv и загружает эти данные на SQL-сервер. Я не хотел перегружать свой вопрос слишком большим количеством кода. Это единственный код, относящийся к моему вопросу. Это внутри другой статической функции – user6451557

+0

@ user6451557 Вам не нужно показывать все, но наличие имени класса/метода упрощает обращение к вещам в разговорах. –

0
private static int s_Counter = 1; 

public static IncrementCounter() { Interlocked.Increment(ref s_Counter); } 

public static int Counter { get { return s_Counter; } } 

Мы используем Interlocked.Increment вместо s_Counter += 1 в случае, если вы решите сделать код многопоточный. (Как правило, статические методы/свойства должны быть спроектированы так, чтобы быть потокобезопасными.)

0

Вы можете сделать это как статическое, чтобы значение сохранялось в течение вызова, но значение счетчика будет сброшено, если вы перезапустите приложение, которое приведет к некоторому нежелательному поведению. Лучшей практикой является сохранение значения счетчика в базе данных или файле, чтобы даже после перезапуска приложения вы могли получить доступ к обновленному значению счетчика, и ваш код будет правильно.

Смежные вопросы