Почему свойство Name равно <Unknown>в FileStream, который использует конструкторы дескрипторов? - PullRequest
0 голосов
/ 10 апреля 2010

Скажем, вы получили дескриптор файла из какой-то внешней библиотеки DLL и создали с него FileStream. Он отлично работает для чтения и записи.

Затем вам нужен путь и имя этого дескриптора, и вы пытаетесь получить доступ к свойству Name вашего объекта FileStream, и он возвращает «unknown».

Это верно для конструкторов, использующих дескрипторы файлов:

public FileStream(IntPtr handle, ...
public FileStream(SafeFileHandle handle, ...

Я знаю короткий ответ, потому что он не реализован. Закрытое поле _fileName из FileStream никогда не назначается в этих конструкторах.

Похоже, что API для получения имени из дескриптора включает более одной строки кода, но я все еще думаю, что они могли бы потрудиться включить это.

Итак, настоящие вопросы: почему нет? Или они просто забыли?

1 Ответ

1 голос
/ 10 апреля 2010

Нет документированного способа получения имени файла, связанного с дескриптором файла.Приведенный вами пример может работать только для файлов с отображением в памяти, он опирается на функцию API GetMappedFileName ().Для обычных файловых дескрипторов такого API не существует.

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

Вы, вероятно, можете узнать, как это сделать, прибегая к помощи NtQuerySystemInformation.Ежедневно делайте резервные копии вашего жесткого диска, если вы планируете его использовать.

...