Перечисление файловых дескрипторов в C # - PullRequest
7 голосов
/ 10 апреля 2010

Я хотел бы знать, возможно ли перечислить файловые дескрипторы в c #, возможно, используя Win32API. Это легко сделать для дескрипторов окон и процессов, но кажется, что это невозможно для дескрипторов файлов.

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

Ответы [ 4 ]

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

Ну, вы знаете, что это возможно, утилита SysInternals 'Handle делает это. NtQueryInformation не будет прекращена, это существенный низкоуровневый интерфейс между Win32 и «реальной» операционной системой.

Что, однако, никогда не произойдет, так это то, что аргументы NtQueryInformation, которые позволяют перебирать дескрипторы, будут задокументированы. Поскольку это не останавливается на достигнутом, некоторые маппеты будут использовать его для вызова метода CloseHandle () для файла, который он / она не хочет блокировать. Что является очень хорошим способом уничтожить содержимое вашего жесткого диска.

Процесс, которому принадлежал дескриптор, не знает, что дескриптор закрыт. Он просто продолжит писать в него, вероятно, полностью игнорируя код возврата «это не сработало» из WriteFile (). Что безвредно, пока программа не откроет другой дескриптор, возвращая то же значение, что и тот, который был закрыт ранее. Теперь он начинает писать смесь мусора (предназначенного для предыдущего дескриптора) и новых данных в дескриптор. Совершенно уничтожая содержание всего, что оно пишет. Раскрутите ленты резервного копирования, если это что-то вроде критически важной базы данных.

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

Вот готовый класс для C # http://sourceforge.net/projects/processhacker/

0 голосов
/ 11 июня 2010

Я нашел рабочий пример перечисления файловых дескрипторов с именами в C # здесь ...

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/ac990847-6d04-4ae0-aafe-8355bbc3f769

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

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

Вы можете вызвать sysinternal's Handle и проанализировать результат, или написать драйвер файловой системы (может потребоваться несколько лет, а сделать невозможно в C # )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...