2016-01-20 4 views
1

У меня есть следующая проблема: У меня есть строковая переменная, которая должна хранить путь к файлу. В цикле foreach я просматриваю все файлы в определенном каталоге и im ищет самый старый, который сохраняется в этой строковой переменной. Когда цикл закончен, я пытаюсь удалить этот файл, но я получаю сообщение об ошибке: Использование неназначенной локальной переменной.C# переменная доступа foreach

Вот код:

DateTime min = DateTime.Now; 
string[] fileNames = Directory.GetFiles(somePath); 
string fileDelete; 
int countFiles = fileNames.Length; 
if (countfiles > 5) 
{ 
    foreach (string someFile in fileNames) 
    { 
     FileInfo infoFile = new FileInfo(someFile); 
     if (infoFile.CreationTime <= min) 
     { 
      min = infoFile.CreationTime; 
      fileDelete = someFile; 
     } 
    } 
    File.Delete(fileDelete); 
} 

это говорит о том, что строка FileDelete в File.Delete (FileDelete) не имеет значения, но удовольствие тонкий, когда я даю ему значение в начале, просто например:

string fileDelete = "blabla"; 

он отлично работает. Это просто отрезала метода в случае, если вы задаетесь

+1

Когда вы делаете 'строку FileDelete = "BlaBla";', переменная больше не Unassigned.Является ли 'countFiles' больше, чем' 5'? Имеет ли хотя бы один файл время создания до 'DateTime.Now'? Ваш код не гарантирует, что 'fileDelete' назначен, поэтому в какой-то момент он будет ошибочным. –

+0

Как говорили другие, компилятор может работать только с переменной, если он явно инициализирован. Так что просто используйте 'string fileDelete =" ";' – Fabjan

+0

Спасибо всем за тэнов. Теперь я понимаю проблему. Я просто забыл, что компилятор не может знать, что условие 2 всегда выполняется, когда условие 1 (в моей программе), и компилятор видел случай, когда File.Delete будет выполнен без значения, хотя это не может произойти в мой код. – sebastian

ответ

1

Он работает точно так же, как предполагалось.

В C# локальные переменные не инициализируются автоматически при объявлении.

Вы не оцениваете значение fileDelete при его объявлении и присваиваете его только при некоторых условиях в вашем цикле. не

Но вы пытаетесь использовать его значение вне этого условия в цикле, таким образом, компилятор не может вывести - будет fileDelete имеют некоторое значение во время выполнения или нет (если не будет выполнен код при условии - тогда fileDelete воли не имеет стоимость).

Таким образом, компилятор генерирует эту ошибку.

+0

это правильно спасибо. Я просто забыл, что компилятор не может знать, что условие 2 всегда выполняется, когда условие 1 (в моей программе). – sebastian

0

Представьте себе такой сценарий:

  • countFiles > 5 является Правда
  • infoFile для someFile больше, чем min

Что будет значение fileDelete есть когда передано File.Delete?

Ответ: В таком случае fileDelete будет неинициализирован, поэтому сообщение об ошибке.

+0

Thats 100% right. Я просто не видел этого случая, потому что это не может произойти в моей программе, но, конечно, компилятор считает, что это может произойти. – sebastian

3

В C# вам нужно инициализировать переменные, иначе вы можете передать значения мусора в File.Delete.

Я рекомендую использовать

string fileDelete = null; // or "" 

, а затем проверить, что.

if (!string.IsNullOrEmpty(fileDelete)) 
{ 
    File.Delete(fileDelete); 
} 
0

Используйте этот

DateTime min = DateTime.Now; 
string[] fileNames = Directory.GetFiles(somePath); 
string fileDelete; 
int countFiles = fileNames.Length; 
if (countfiles > 5) 
{ 
    foreach (string someFile in fileNames) 
    { 
     FileInfo infoFile = new FileInfo(someFile); 
     if (infoFile.CreationTime <= min) 
     { 
      min = infoFile.CreationTime; 
      fileDelete = someFile; 
      File.Delete(fileDelete); 
     } 
    } 

} 
+0

это сделало бы fileDelete полностью избыточным – Laurijssen

+0

Я не тестировал это, но я думаю, что это просто удалит все файлы, которые старше, чем сейчас. Но я хотел удалить только самый старый файл в определенном каталоге – sebastian