在C#中获取任何扩展文件属性

时间:2015-03-27 19:23:04

标签: c#

我正在尝试找到一种方法来获取C#中COM DLL上的扩展文件属性(特别是“产品版本”)。我在MSDN上发现了一些使用Shell32添加“Microsoft Shell控件和自动化”COM参考的示例,但文档似乎有些模糊。有一种简单的方法可以做到这一点吗?

例如:使用C:\ Windows \ Notepad.exe的以下属性:

Properties of Notepad.exe

我想以编程方式获取C#中的“Product version”属性。顺便说一句,这可能是任何文件,但是,我只是使用Notepad.exe,因为它是一个通用的例子

3 个答案:

答案 0 :(得分:4)

或者,您可以使用FileVersionInfo类在一行中执行此操作:

Console.WriteLine(FileVersionInfo.GetVersionInfo(@"C:\Windows\notepad.exe").ProductVersion);

答案 1 :(得分:1)

我想出了以下易于使用的函数,它将返回任何文件属性的值:

 public static string GetExtendedFileAttribute(string filePath, string propertyName)
    {
        string retValue = null;
        Type shellAppType = Type.GetTypeFromProgID("Shell.Application");
        object shell = Activator.CreateInstance(shellAppType);
        Shell32.Folder folder = (Shell32.Folder)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { @"C:\Windows\System32" });
        int? foundIdx = null;
        for (int i = 0; i < short.MaxValue; i++)
        {
            string header = folder.GetDetailsOf(null, i);
            if (header == propertyName)
            {
                foundIdx = i;
                break;
            }
        }

        if (foundIdx.HasValue)
        {
            foreach (FolderItem2 item in folder.Items())
            {
                if (item.Name.ToUpper() == System.IO.Path.GetFileName(filePath).ToUpper())
                {
                    retValue = folder.GetDetailsOf(item, foundIdx.GetValueOrDefault());
                    break;
                }
            }
        }


        return retValue;

    }

这是一个如何调用它的例子:

 static void Main(string[] args)
    {
        Console.WriteLine(GetExtendedFileAttribute(@"C:\Windows\Notepad.exe", "Product version"));   
        Console.ReadLine();
    }

这是输出:

enter image description here

答案 2 :(得分:0)

.NET有内置方法来执行此操作。

MessageBox.Show("Notepad product version " + GetProductVersion("C:\\Windows\\notepad.exe"), "Product Version");

public string GetProductVersion(string fileName)
{
    System.Diagnostics.FileVersionInfo fileVersionInfo =
        System.Diagnostics.FileVersionInfo.GetVersionInfo(fileName);
    return fileVersionInfo.ProductVersion;
}

Result