有对应的需求,需要获取文件的详细信息内容。该页面信息大部分来源于文件的版本信息,使用FileInfo类并不能获取到。

VERSIONINFO 资源 - Win32 apps | Microsoft Learn

信息格式:


1 VERSIONINFO
FILEVERSION 1,0,0,323
PRODUCTVERSION 1,0,0,0
FILEOS 0x4
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
BLOCK "000004B0"
{
VALUE "Comments", "这是一个示例库,由张三编写。"
VALUE "CompanyName", "webre"
VALUE "FileDescription", "webre"
VALUE "FileVersion", "1.0.0.323"
VALUE "InternalName", "webre.dll"
VALUE "LegalCopyright", "版权所有 \xA9 2024 张三"
VALUE "LegalTrademarks", ""
VALUE "OriginalFilename", "webre.dll"
VALUE "ProductName", "webre"
VALUE "ProductVersion", "1.0.0"
VALUE "Assembly Version", "1.0.0.323"
VALUE "Test", "Test"//自定义属性
}
} BLOCK "VarFileInfo"
{
VALUE "Translation", 0x0000 0x04B0
}
}

为了获取versioninfo信息,需要使用version.dll内的api进行指定段内的信息获取。参考如下:

GetFileVersionInfoA function (winver.h) - Win32 apps | Microsoft Learn

GetFileVersionInfoSizeA function (winver.h) - Win32 apps | Microsoft Learn

VerQueryValueW function (winver.h) - Win32 apps | Microsoft Learn

调用代码如下:

//需要引入win32api
[DllImport("version.dll", CharSet = CharSet.Unicode)]
private static extern bool GetFileVersionInfo(string fileName, int handle, int len, byte[] data); [DllImport("version.dll", CharSet = CharSet.Unicode)]
private static extern int GetFileVersionInfoSize(string fileName, out int handle); [DllImport("version.dll", CharSet = CharSet.Unicode)]
private static extern bool VerQueryValue(byte[] data, string subBlock, out IntPtr buffer, out int len); var attrs = new string[] {
"Comments","InternalName","ProductName",
"CompanyName","LegalCopyright","ProductVersion",
"FileDescription","LegalTrademarks","PrivateBuild",
"FileVersion","OriginalFilename","SpecialBuild","Test"
}; // 获取文件版本信息的大小
int handle;
int infoSize = GetFileVersionInfoSize(dllPath, out handle);
if (infoSize == 0)
{
throw new Exception("Failed to get file version info size. Error: " + Marshal.GetLastWin32Error());
} // 分配缓冲区
byte[] infoBuffer = new byte[infoSize]; // 获取文件版本信息
if (!GetFileVersionInfo(dllPath, 0, infoSize, infoBuffer))
{
throw new Exception("Failed to get file version info. Error: " + Marshal.GetLastWin32Error());
} // 获取所有语言代码
IntPtr buffer;
int len;
if (!VerQueryValue(infoBuffer, @"\VarFileInfo\Translation", out buffer, out len))
{
throw new Exception("Failed to get language codes. Error: " + Marshal.GetLastWin32Error());
} // 解析语言代码
List<string> languageCodes = new List<string>();
for (int i = 0; i < len / 4; i++)
{
int langCode = Marshal.ReadInt16(buffer, i * 4);
int subLangCode = Marshal.ReadInt16(buffer, i * 4 + 2);
string languageCode = $"{langCode:X4}{subLangCode:X4}";//win下小端存储
languageCodes.Add(languageCode);
} // 输出所有语言代码
Console.WriteLine("Available Language Codes:");
foreach (string languageCode in languageCodes)
{
Console.WriteLine(languageCode);
} // 选择第一个语言代码
string selectedLanguageCode = languageCodes.Count > 0 ? languageCodes[0] : "040904B0";//默认为英文 foreach (var attr in attrs)
{
if (!VerQueryValue(infoBuffer, $@"\StringFileInfo\{selectedLanguageCode}\{attr}", out buffer, out len))
{
Console.WriteLine($"Failed to get {attr}. Error: " + Marshal.GetLastWin32Error());
}
else
{
string value = Marshal.PtrToStringUni(buffer);
Console.WriteLine($"{attr}: " + value);
}
}

在调用VerQueryValue后,通过buffer获取到内存地址,观察一下内存数据。

version信息映射到一段连续内存中存储。

另外还有更简单的方式,通过封装好的FileVersionInfo类进行信息获取,通过各种属性即可获取版本信息。不过,自定义的属性就获取不到了。

FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(dllPath);

FileVersionInfo win平台的实现,内部也是调用了version.dll内的相关api,不过调用的都是Ex方法,并对codepage做了处理。

使用C#获取文件详情的更多相关文章

  1. 获取文件的缩略图Thumbnail和通过 AQS - Advanced Query Syntax 搜索本地文件

    演示如何获取文件的缩略图 FileSystem/ThumbnailAccess.xaml <Page x:Class="XamlDemo.FileSystem.ThumbnailAcc ...

  2. FastDFS 通过文件名获取文件信息

    /** * 获取文件信息 * * param string group_name 文件所在的组名 * param string file_id 文件id(如: M00/09/BE/rBBZolgj6O ...

  3. c# .net获取文件夹下的所有文件(多层递归),并获取区间数据(Jsion,xml等数据)写出到处理文件,学习分享~

    static void Main(string[] args)        { string path = string.Format(@"C:\Users\Administrator\D ...

  4. java 获取文件列表,并按照文件名称排序

    需求:获取全部的日志文件,并按照文件名称倒序排列,把最新的文件放在最前1.获取全部的日志文件:(方法:public List<String> ergodic(File file,List& ...

  5. Windows Store App JavaScript 开发:获取文件和文件夹列表

    在应用程序中有时可能需要获取用户库中的内容,以便执行相关的操作.如果要获取某个用户库中的内容,需要先获取到这个用户库,获得用户库可以通过Windows.Storage命名空间中的KnownFolder ...

  6. ftpget 从Windows FTP服务端获取文件

    /********************************************************************************* * ftpget 从Windows ...

  7. C# 获取文件路径

    1.C# 获取文件路径:http://www.cnblogs.com/bq-blog/archive/2012/09/01/2666394.html

  8. C#获取文件MD5字符串

    备注 哈希函数将任意长度的二进制字符串映射为固定长度的小型二进制字符串.加密哈希函数有这样一个属性:在计算不大可能找到散列为相同的值的两个不同的输入:也就是说,两组数据的哈希值仅在对应的数据也匹配时才 ...

  9. [Android Pro] 关于inputStream.available()方法获取文件的总大小

    reference to :http://hold-on.iteye.com/blog/1017449 如果用inputStream对象的available()方法获取流中可读取的数据大小,通常我们调 ...

  10. php获取文件夹下面的文件列表和文件夹列表

    function getDir($dir) { $dirArray[] = NULL; if (false != ($handle = opendir( $dir ))) { $i=0; while ...

随机推荐

  1. String 的 intern() 方法

    问题: String s1 = "a" + "b"; //创建了几个对象? String s2 = new String("ab"); // ...

  2. 音视频入门-8-ffmpeg小实验-v4l2 ubuntu取图、格式转换、编码成H264,ffplay观看

    1. getpic_transform_encode2h264.c #include <stdio.h> #include <string.h> #include <st ...

  3. 树状数组 java模板(纯代码)

    public class TrieNums { int n; /*Nums start from 0*/ int[] storage; /*TrieNums index start from 1*/ ...

  4. 解决 SHADERed无法打开,报错 缺失XINPUT1_4.DLL 文件的办法

    起因: 在给某个不知名的同事安装软件时遇到的一个问题,安装完成后打开软件报错:SHADERed无法打开,报错 缺失XINPUT1_4.DLL ,C++依赖项均已打上,卸载C++插件后依然报错只能找缺失 ...

  5. Laravel视图共享数据

    Laravel视图共享数据 最近在用lavavel过程中想实现公共头部尾部需要的配置数据在所有的页面中都可以使用,便查看了官方文档,在此做一个总结: 一. 修改 ComposerServiceProv ...

  6. bpftool使用方法简介

    1.安装bpftool工具 看起来,在不同的linux发行版里,bpftool在不同的软件包里,ubuntu 22上,bpftool是linux-tools-generic的一部分,而树莓派里bpft ...

  7. 轨道控制器 threejs

    就是一个可以360转动的相机,通过不断的改变相机的参数 然后渲染达到效果. // 引入相机控件  -- 轨道控制器 // console.log('OrbitControls',OrbitContro ...

  8. 云原生周刊:Knative 1.15 版本发布|2024.8.5

    开源项目推荐 helm-secrets helm-secrets 是一个 Helm 插件,用于动态解密加密的 Helm 值文件. Tofu Controller Tofu Controller(以前称 ...

  9. Nuxt.js 应用中的 pages:extend 事件钩子详解

    title: Nuxt.js 应用中的 pages:extend 事件钩子详解 date: 2024/10/25 updated: 2024/10/25 author: cmdragon excerp ...

  10. 递推(C语言)

    文章目录 1.斐波那契数列 2.太波那契数列 3.二维递推问题 4.实战 4.1 力扣509 斐波那契数 4.2 力扣70 爬楼梯 4.3 力扣119 杨辉三角|| 递推最通俗的理解就是数列,递推和数 ...