roarkrsp Ответов: 1

Почему я не могу получить свойства файла с помощью этих строк кода


Привет,

Мне нужно получить свойства программы "ProgA", когда я запускаю программу"ProgB".
Я получаю его информацию, когда щелкаю правой кнопкой мыши по "ProgA" в Проводнике Windows и иду в свойства / детали:

Драйвер описание файла прога
Тип Приложения
Файл версия 4.0.0.0
Наименование товара прога
Версия 4.0.0.0
Программное обеспечение авторские права АВС
Размер 653 КБ
Дата изменения 4/19/2016 11: 30 вечера
Язык Английский (США)
Исходное имя файла прога

Это также информация, которую я хочу / должен получить из этих кодовых линий



Но когда я использую этот код ниже в "ProgB", я получаю только эту информацию ( эту информацию я получаю, когда отлаживаю в Visual Studio)

-		versInfo	{System.Diagnostics.FileVersionInfo}	System.Diagnostics.FileVersionInfo
		Comments	""	string
		CompanyName	""	string
		FileBuildPart	0	int
		FileDescription	""	string
		FileMajorPart	4	int
		FileMinorPart	0	int
+		FileName	'versInfo.FileName' threw an exception of type 'System.ArgumentException'	string {System.ArgumentException}
		FilePrivatePart	0	int
		FileVersion	""	string
		InternalName	""	string
		IsDebug	false	bool
		IsPatched	false	bool
		IsPreRelease	false	bool
		IsPrivateBuild	false	bool
		IsSpecialBuild	false	bool
		Language	"English (United States)"	string
		LegalCopyright	""	string
		LegalTrademarks	""	string
		OriginalFilename	""	string
		PrivateBuild	""	string
		ProductBuildPart	0	int
		ProductMajorPart	4	int
		ProductMinorPart	0	int
		ProductName	""	string
		ProductPrivatePart	0	int
		ProductVersion	""	string
		SpecialBuild	""	string



Что я делаю не так?

I do not get any error message in "ProgB", but I do not get the same info  with the code as I get when using Windows Explorer to check the "ProgA" properties.


Что я уже пробовал:

var versInfo = FileVersionInfo.GetVersionInfo("ProgA.exe");

  String fileVersion = versInfo.FileVersion;
  String productVersion = versInfo.ProductVersion;
  string productName = versInfo.ProductName;

Richard MacCutchan

Пожалуйста, отредактируйте свой вопрос и покажите строку кода, которая дает ошибку и точное сообщение об ошибке.

[no name]

FileVersionInfo, вероятно, не знает, что "ProgA.exe" есть

1 Ответов

Рейтинг:
1

#realJSOP

Попробуйте указать полный путь к файлу, для которого вы хотите получить информацию о версии. Кроме того, поместите блок try/catch вокруг вашего кода, чтобы вы могли видеть, что на самом деле является ошибкой. Например:


FileVersionInfo versionInfo    = null;
string          fileVersion    = string.Empty;
string          productVersion = string.Empty;
string          productName    = string.Empty;

try
{
    versionInfo    = FileVersionInfo.GetVersionInfo(@"c:\some folder\ProgA.exe");
    fileVersion    = versInfo.FileVersion;
    productVersion = versInfo.ProductVersion;
    productName    = versInfo.ProductName;
}
catch (Exception ex)
{
    // if an exception is thrown, you can inspect it here by
    // setting a breakpoint on either of the curly braces
}


[no name]

Вам нужно будет экранировать строку пути к файлу.

#realJSOP

Ой-исправил. Это то, что я получаю за ввод кода непосредственно в Редактор вместо того, чтобы использовать VS, а затем копировать/вставлять...

roarkrsp

Мой исходный код и код, предоставленный Джоном Симмонсом, дают ту же информацию.
То
необязательный параметр
свойство ProductVersion
значение ProductName

все они пусты ("").

Когда я меняю имя файла на другое существующее имя программы, оно дает правильную информацию. Так что это, должно быть, прога, которая не является правильной в некотором роде. Но почему Проводник Windows может получить правильную информацию?
Поскольку проводник Windows способен получить правильную информацию, как я могу использовать те же методы, которые использует Проводник Windows для получения правильной информации?

roarkrsp

Это, как я сделал свой ресурс.RC в мой код прога для Win32

// // Версия
//
// Версия
//

VS_VERSION_INFO VERSIONINFO
Необязательный параметр 4,0,0,0
Версия продукта 4.0,0,0,0
FILEFLAGSMASK 0x3fL

после условной



FILEFLAGS 0x1L

ещё



FILEFLAGS 0x0L

за endif



FILEOS 0x40004L
Тип файла 0x1L
FILESUBTYPE 0x0L
НАЧАТЬ
Блок " StringFileInfo"
НАЧАТЬ
Блок "040904b0"
НАЧАТЬ
Значение "CompanyName", " abcsoftware"
Значение "FileDescription", " драйвер программного обеспечения для Xbong"
// Значение "FileVersion", " 4.0.0.0"
Значение "InternalName", "ProgA.exe"
Значение "LegalCopyright", " Copyright (C) 2016 abcsoftware"
Значение "OriginalFilename", "ProgA.exe"
Значение "ProductName", " ProgA"
Значение "ProductVersion", "4.0.0.0"
КОНЕЦ
КОНЕЦ
Блок " VarFileInfo"
НАЧАТЬ
Значение "перевод", 0x409, 1200
КОНЕЦ
КОНЕЦ

Проводник Windows может сообщить свою информацию правильно, щелкнув правой кнопкой мыши и перейдя к свойствам/деталям, но не к моему коду в ProgB

#realJSOP

Вы действительно запускаете ProgA, когда делаете это?

#realJSOP

Кроме того, почему вы вообще возитесь с информацией о версии файла в rc-файле? Компилятор обрабатывает все это за вас.

roarkrsp

Нет, ProgA не работает, это программа, неактивная в папке, но мне нужно получить ее свойства при запуске ProgB.

#realJSOP

Ну, я понятия не имею, почему это не работает и чего вы ожидаете от "соответствия". IO просто попробовал это в приложении, которое я пишу прямо сейчас, и данные FileVersionInfo, которые я получаю, совпадают с тем, что возвращает Проводник Windows (проводник не возвращает все свойства, кстати, но те, которые он возвращает, совпадают просто отлично).

roarkrsp

Именно так я давным-давно реализовал настройки версии кода. С тех пор я им пользуюсь, и он прекрасно работает. Может быть, это и есть причина моих проблем, но я до сих пор не понимаю, почему проводнику Windows удается получить правильную информацию о свойстве, а не мой код?

#realJSOP

Вы все еще не сказали того, что неправильно (это я видел).

roarkrsp

Как указано в моем первом вопросе, я получаю информацию ниже, когда ищу свойства ProgA с помощью Проводника Windows (щелкните правой кнопкой мыши и свойства / детали)

Драйвер описание файла прога
Тип Приложения
Файл версия 4.0.0.0
Наименование товара прога
Версия 4.0.0.0
Программное обеспечение авторские права АВС
Размер 653 КБ
Дата изменения 4/19/2016 11: 30 вечера
Язык Английский (США)
Исходное имя файла прога


Но при использовании кода, который у меня был изначально, и предложенного вами кода я ничего не получаю

информация о недвижимости.
Вот что я получаю (от отладки в Visual Studio)

versInfo {система.Диагностика.FileVersionInfo} Система.Диагностика.FileVersionInfo
Комментарии "" строка
Название организации "" строку
FileBuildPart 0 int
FileDescription "" строка
FileMajorPart 4 int
FileMinorPart 0 int
+ Имя файла ' versInfo.FileName 'выбросил исключение типа' System.Строковое значение' {система.ArgumentException}
FilePrivatePart 0 int
FileVersion "" строка
Внутреннее_имя "" строку
Атрибут отладчик значение false типа bool
IsPatched false bool
IsPreRelease false bool
IsPrivateBuild false bool
IsSpecialBuild false bool
Язык" английский (Соединенные Штаты) " строка
LegalCopyright "" строка
LegalTrademarks "" строка
OriginalFilename "" строка
PrivateBuild "" строка
ProductBuildPart 0 int
ProductMajorPart 4 int
ProductMinorPart 0 int
ProductName "" строка
ProductPrivatePart 0 int
ProductVersion "" строка
SpecialBuild "" строка

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

roarkrsp

Может быть, мне стоит попытаться позволить Visual Studio справиться с управлением версиями. Но как мне это сделать? Есть ли вариант, который я должен установить, прежде чем строить?

#realJSOP

Попробуйте сделать чистое / полное решение для progA. После этого у меня закончились идеи.