Как мне получить версию файла из байтов или потока?

#c# #.net #windows

Вопрос:

Я получаю версию файла таким образом:

 var fileVersion = FileVersionInfo.GetVersionInfo(path).FileVersion
 

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

Ответ №1:

К сожалению, вы не можете сделать это напрямую

вам следует

  • Запишите файл на диск в какое-нибудь временное место
  • Прочитайте версию из файла на диске
  • Удалите файл

Ответ №2:

Короче говоря, нет, то, что вы хотите, невозможно с помощью текущих инструментов. Проблема в том, что, как вы заметили, FileVersionInfo.GetVersionInfo для присутствия на диске требуется физический файл. Если вы посмотрите на его внутреннее устройство, вы увидите, что все, что он действительно делает, — это делегирует API Windows, который выполняет реальную работу, именно в функции GetFileVersionInfo, которая, в свою очередь, также принимает имя файла в качестве параметра, поэтому она предназначена только для работы из файловой системы.

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

Другим вариантом было бы поискать библиотеку, которая может анализировать файлы exe/dll в памяти и извлекать соответствующие сведения непосредственно оттуда.

Комментарии:

1. Это выглядит убедительно, но, видимо, те, кому это не нравится, не согласны. Интересно узнать их мнение 🙂