FileStream используется

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

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

person PositiveGuy    schedule 15.02.2010    source источник


Ответы (4)


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

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

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

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

person Mark Byers    schedule 15.02.2010

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

File.ReadAllText(string path);

or

File.ReadAllBytes(string path);

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

person Manu    schedule 15.02.2010

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

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

Лично, если я сам пишу обработку ошибок, я предпочитаю try/catch/finally вместо try/using/catch. Другой сценарий, в котором я намного предпочитаю использовать 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();
}

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

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

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

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

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

person Paul Creasey    schedule 15.02.2010