2015-12-27 44 views
0

我有一個zip文件,其中包含一個exe文件,我想獲取exe文件的版本號,而不必物理提取它。如何讀取ZIP檔案中的.exe版本號?

我知道如何閱讀壓縮文件的內容,並有代碼將讀取其中的文本文件,但我無法找到如何獲取exe的版本。

+0

那麼現在你有內存中的dll的內容作爲'byte []'? –

+0

@YacoubMassad我可以這樣想。之前我做過這些時,我正在閱讀文本文件,但是我沒有看到任何我無法讀取byte []的原因。那將如何幫助?即使那樣,我也找不到任何方式獲取版本號。 Thx –

回答

1

添加對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); 
    } 
} 
+0

感謝您的回覆,這是一段很棒的代碼。不幸的是,它沒有顯示版本號。它顯示類型,壓縮大小,比例等,但沒有版本號。有任何想法嗎? –

+0

很抱歉聽到它沒有工作。我做了更多的Google搜索,看起來版本信息是不可能的,如果該文件沒有被提取第一。根據我的知識編輯答案以提供最佳方法。 –