使用C#从文件获取MetaData信息 [英] Getting MetaData information from a file using C#

查看:1145
本文介绍了使用C#从文件获取MetaData信息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用Shell从文件获取元数据。我使用MVC5和Windows 8操作系统。以下是以下代码。

I was trying to get the metadata from a file using Shell. I am using MVC5 and Windows 8 OS. Here is the below code.

代码

public JsonResult Ind(string file)
{
    List<string> arrHeaders = new List<string>();
    string filename = Path.GetFileName(file);
    Shell shell = new ShellClass();
    Folder rFolder = shell.NameSpace(file);
    FolderItem rFiles = rFolder.ParseName(filename);
    for (int i = 0; i < short.MaxValue; i++)
    {
         string value = rFolder.GetDetailsOf(rFiles, i).Trim();
         arrHeaders.Add(value);
    }
    return Json(arrHeaders, JsonRequestBehavior.AllowGet);
 }

当我尝试运行上面的代码时,无法将类型为Shell32.ShellClass的COM对象转换为接口类型Shell32.IShellDispatch6。此操作失败,因为由于以下错误,COM组件上的QueryInterface调用与IID'{286E6F1B-7113-4355-9562-96B7E9D64C54}'的接口失败:没有此类接口支持(来自HRESULT的异常:0x80004002(E_NOINTERFACE))

When I try to run the above code, I am getting error Unable to cast COM object of type 'Shell32.ShellClass' to interface type 'Shell32.IShellDispatch6'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{286E6F1B-7113-4355-9562-96B7E9D64C54}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

是否有其他更好的解决方案,从不同的文件格式读取元数据? Pls建议我什么。非常感谢你。

Is there any other better solution to read metadata from different file formats?? Pls suggest me anything. I ll appreciate you.

感谢

推荐答案

严格参考与目标系统不同的构建系统上的特定版本的Shell32对象。

Seems that problem is in strict reference to specific version of Shell32 object(s) on build system which is differs from target system.

这里是你的引用在项目文件中的样子在特定情况下):

Here is how your reference looks like in project file (C# project in given case):

 <COMReference Include="Shell32">
  <Guid>{50A7E9B0-70EF-11D1-B75A-00A0C90564FE}</Guid>
  <VersionMajor>1</VersionMajor>
  <VersionMinor>0</VersionMinor>
  <Lcid>0</Lcid>
  <WrapperTool>tlbimp</WrapperTool>
  <Isolated>False</Isolated>
</COMReference>

因此,在引用您使用的特定版本的Shell(ShellClass)

So after referencing you're using specific version of Shell (ShellClass), which implements

[Guid("D8F015C0-C278-11CE-A49E-444553540000")]
[TypeLibType(4176)]
public interface IShellDispatch

为了防止在不同的平台上,最好通过名称使用反射创建所需的对象,而不是使用特定版本\libraries引用特定类型。代替此代码:

To prevent this on different platforms it is better to create needed objects by name using reflection, rather than referencing specific types with specific versions\libraries. Instead of this code:

Shell shell = new ShellClass();
Folder rFolder = shell.NameSpace(file);

您可以通过这种方式创建Folder对象:

You can create Folder object this way:

    private static Folder GetShell32NameSpaceFolder(Object folder)
    {
        var shellAppType = Type.GetTypeFromProgID("Shell.Application");

        var shell = Activator.CreateInstance(shellAppType);
        return (Folder)shellAppType.InvokeMember("NameSpace",
        System.Reflection.BindingFlags.InvokeMethod, null, shell, new [] { folder });
    }

另请注意,方法shell.NameSpace文件夹,它可以是一个字符串,指定文件夹的路径或ShellSpecialFolderConstants值之一。 (MSDN),所以你应该传递不是文件路径,而是所需文件的目录路径,例如,Path.GetDirectoryName(文件)。

Also note that method shell.NameSpace(...) parameter is "The folder for which to create the Folder object. This can be a string that specifies the path of the folder or one of the ShellSpecialFolderConstants values." (MSDN), so you should pass not file path, but directory path of the desired file by, for example, Path.GetDirectoryName(file).

工作方式:

    public JsonResult Ind(string file)
    {
        List<string> arrHeaders = new List<string>();
        string filename = Path.GetFileName(file);
        Folder rFolder = GetShell32NameSpaceFolder(Path.GetDirectoryName(file));
        FolderItem rFiles = rFolder.ParseName(filename);
        for (int i = 0; i < short.MaxValue; i++)
        {
             string value = rFolder.GetDetailsOf(rFiles, i).Trim();
             arrHeaders.Add(value);
        }
        return Json(arrHeaders, JsonRequestBehavior.AllowGet);
    }

    private static Folder GetShell32NameSpaceFolder(Object folder)
    {
        var shellAppType = Type.GetTypeFromProgID("Shell.Application");

        var shell = Activator.CreateInstance(shellAppType);
        return (Folder)shellAppType.InvokeMember("NameSpace",
        System.Reflection.BindingFlags.InvokeMethod, null, shell, new [] { folder });
    }

这篇关于使用C#从文件获取MetaData信息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆