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

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

3 голосов
/ 15 февраля 2010

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

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

Ответы [ 4 ]

18 голосов
/ 15 февраля 2010

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

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

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

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

4 голосов
/ 15 февраля 2010

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

File.ReadAllText(string path);

или

File.ReadAllBytes(string path);

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

3 голосов
/ 15 февраля 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();
}

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

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

0 голосов
/ 15 февраля 2010

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

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

...