Могу ли я повторно открыть дескриптор после того, как FileStream закроет его в c #? - PullRequest
0 голосов
/ 27 октября 2019

я хочу знать, могу ли я повторно открыть дескриптор после того, как FileStream закроет его ??

это мой код

static void Main(string[] args)
    {

        string path = "Hello";
        SafeFileHandle handle = File.Open(path, FileMode.OpenOrCreate).SafeFileHandle;
        using (FileStream fs1 = new FileStream(handle, FileAccess.ReadWrite))
        {
            // do some work
        }
        using (FileStream fs2 = new FileStream(handle, FileAccess.ReadWrite))
        {
            // do some work
        }

        Console.ReadKey();
    }

я получаю сообщение об ошибке "дескриптор был закрыт" вобъявляя fs2.

Спасибо:)

1 Ответ

1 голос
/ 27 октября 2019

Нет. Дескриптор получается при открытии файла и становится недействительным после его закрытия. Просто держите файл открытым.

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

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

...