如何读取zip存档中的.exe版本号?

时间:2015-12-27 17:06:10

标签: c# reflection zip

我有一个包含exe的zip文件,我想获取exe文件的版本号,而不必在物理上提取它。

我知道如何阅读zip文件的内容,并且有代码可以读取其中的文本文件,但我无法找到如何获取exe版本。

1 个答案:

答案 0 :(得分: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);  
  }
}