我有一個zip文件,其中包含一個exe文件,我想獲取exe文件的版本號,而不必物理提取它。如何讀取ZIP檔案中的.exe版本號?
我知道如何閱讀壓縮文件的內容,並有代碼將讀取其中的文本文件,但我無法找到如何獲取exe的版本。
我有一個zip文件,其中包含一個exe文件,我想獲取exe文件的版本號,而不必物理提取它。如何讀取ZIP檔案中的.exe版本號?
我知道如何閱讀壓縮文件的內容,並有代碼將讀取其中的文本文件,但我無法找到如何獲取exe的版本。
添加對Shell32.dll -library的引用。
然後,你可能會發現你在找什麼與此:
Shell shell = new Shell();
var folder = shell.NameSpace(<path_to_your_zip>);
// Just get the names of the properties
List<string> arrHeaders = new List<string>();
for (int i = 0; i < short.MaxValue; i++)
{
string header = folder.GetDetailsOf(null, i);
if (String.IsNullOrEmpty(header))
break;
arrHeaders.Add(header);
}
// Loop all files inside the zip and output their properties to console
foreach (Shell32.FolderItem2 item in folder.Items())
{
for (int i = 0; i < arrHeaders.Count; i++)
{
Console.WriteLine("{0}\t{1}: {2}", i, arrHeaders[i], folder.GetDetailsOf(item, i));
}
}
編輯:看來,這是不可能的,而無需實際提取的包中的文件。像這樣的事情很簡單,但是如果文件很大並且/或者被高效地壓縮,需要時間。
Shell s = new Shell();
var folder = s.NameSpace(<path_to_your_zip>);
foreach (FolderItem2 item in folder.Items())
{
string oItemName = Path.GetFileName(item.Path);
try
{
string oTargetFile = Path.Combine(Path.GetTempPath(), oItemName);
if (File.Exists(oTargetFile))
File.Delete(oTargetFile);
Folder target = s.NameSpace(Path.GetTempPath());
target.CopyHere(item, 4);
var info = FileVersionInfo.GetVersionInfo(oTargetFile);
if (File.Exists(oTargetFile))
File.Delete(oTargetFile);
Console.WriteLine(oItemName + "'s version is: " + info.FileVersion);
}
catch (Exception e)
{
Console.WriteLine(oItemName + ": Unable to obtain version info.\n" + e.Message);
}
}
感謝您的回覆,這是一段很棒的代碼。不幸的是,它沒有顯示版本號。它顯示類型,壓縮大小,比例等,但沒有版本號。有任何想法嗎? –
很抱歉聽到它沒有工作。我做了更多的Google搜索,看起來版本信息是不可能的,如果該文件沒有被提取第一。根據我的知識編輯答案以提供最佳方法。 –
那麼現在你有內存中的dll的內容作爲'byte []'? –
@YacoubMassad我可以這樣想。之前我做過這些時,我正在閱讀文本文件,但是我沒有看到任何我無法讀取byte []的原因。那將如何幫助?即使那樣,我也找不到任何方式獲取版本號。 Thx –