2010-02-15 4 views
3

Если мой поток файлов используется (каждый раз, когда я пытаюсь отлаживать, он попадает в первую строку и говорит, что он используется), как я могу заставить выпуск? каждый раз, когда она попадет этот код, я получаю сообщение о том, что что-то использовать его:Используемый FileStream

FileStream fileStream = File.Open(@"C:\somefile", FileMode.Open, FileAccess.Read); 
byte[] buffer = new byte[fileStream.Length]; 
...etc. 
fileStream.Close(); 
+0

Каким файлом пользуется? – SLaks

ответ

17

Научится использовать using:

using (FileStream fileStream = File.Open(@"C:\somefile", FileMode.Open, FileAccess.Read)) 
{ 
    ... 
} 

using конструкция гарантирует, что файл будет закрыт, если вы оставите блок, даже если выбрано исключение.

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

4

Рассмотрим также с использованием

File.ReadAllText(string path); 

или

File.ReadAllBytes(string path); 

Если вы просто хотите, чтобы прочитать содержимое файла, и это не слишком большой.

0

с использованием using - правильный подход.

Вы также можете указать опцию fileshare.readwrite, чтобы открыть файл witout, блокирующий его.

2

Предложение использовать заявление using является хорошим; но это не ваш единственный выбор. Разработчики просто предпочитают его синтаксически «чистый» внешний вид и простоту использования.

Главное (и то, что using всегда гарантирует для вас) - это убедиться, что вы звоните FileStream.Close независимо от того, что. Если вы ударите исключение, этот код может быть пропущен. Поэтому, по крайней мере, позвоните по телефону Close в блоке finally.

Лично, если я пишу какую-либо ошибку обработки себе, я предпочитаю try/catch/finally к try/using/catch. Другой сценарий, в котором I много, предпочитает использовать finally, где я работаю с несколькими объектами IDisposable, и я хочу избежать глубокой вложенности. Рассмотрим следующий код:

try { 
    using (DisposableObject obj1 = GetDisposableObject()) { 
     // do something 

     using (DisposableObject obj2 = GetAnotherDisposableObject()) { 
      // do something else 

      using (DisposableObject obj3 = GetYetAnotherDisposableObject()) { 
       // do even more things 

       // this code is now quite nested 
      } 
     } 
    } 

} catch (SomeException ex) { 
    // some error-handling magic 
} 

Теперь сравните, что это:

DisposableObject obj1 = null; 
DisposableObject obj2 = null; 
DisposableObject obj3 = null; 

try { 
    obj1 = GetDisposableObject(); 
    // do something 

    obj2 = GetAnotherDisposableObject(); 
    // do something else 

    obj3 = GetYetAnotherDisposableObject(); 
    // do even more things 

    // this code doesn't have to be nested 

} catch (SomeException ex) { 
    // some error-handling magic 

} finally { 
    if (obj3 != null) obj3.Dispose(); 
    if (obj2 != null) obj2.Dispose(); 
    if (obj1 != null) obj1.Dispose(); 
} 

Лично я считаю, последний гораздо более удобным для чтения.

Очевидно, что это личное предпочтение. Вышеупомянутые два примера кода дают одинаковый результат.

+0

, но если я использую использование, это гарантирует, что он будет закрыт, даже если произойдет исключение, не так ли? – PositiveGuy

+0

@coffeeaddict: Да - так же, как положить его в блок finally (который гарантирует, что все, что находится внутри 'finally', будет запущено, даже если ошибка была выбрана где-то в' try').Обычно я использую 'using', если я сам не обрабатываю какие-либо ошибки; если я хочу поймать исключение, хотя (используя 'catch'), я считаю более чистым использовать' try'/'catch' /' finally', чем 'try' /' using'/'catch' - главным образом потому, что последний предполагает дополнительный уровень гнездования (конечно, личное предпочтение). –