我在Windows中有一个SFX(自解压可执行文件)文件(使用7z
,WinRar
等....等拉链工具创建),其中包含以下详细信息:
我想在C#中获取CopyRight
文本,所以我编写了以下代码:
var fileVersionInfo = FileVersionInfo.GetVersionInfo(filePath);
Console.Write(fileVersionInfo.LegalCopyright)
fileVersionInfo.LegalCopyright
永远是空的!
有什么问题?
编辑:
我的原始代码:
var fileVersionInfo = FileVersionInfo.GetVersionInfo(filePath1);
var properties = typeof(FileVersionInfo).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var propertyInfo in properties)
{
var value = propertyInfo.GetValue(fileVersionInfo);
Console.WriteLine("{0} = {1}", propertyInfo.Name, value);
}
Console.ReadKey();
结果:
答案 0 :(得分:5)
(我的声誉太低,无法发表评论,所以我在这里发布)
我刚刚测试了以下代码,它对我来说很正常。
var fileVersionInfo = FileVersionInfo.GetVersionInfo(@"C:\Users\usr\Desktop\Game\steamIntegration\steam_api.dll");
Console.Write(fileVersionInfo.LegalCopyright);
Console.ReadLine();
也许您的权限不足以支持该文件。在项目中添加* .manifest,将requestedExecutionLevel更改为:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
也许这可以解决你的问题。
答案 1 :(得分:1)
您观察到的行为是由于Microsoft.NET框架类GetVersionInfoForCodePage
的第411行中的私有函数FileVersionInfo
的实现存在缺陷,目前版本为4.6.2且很可能更早一点:
// fileVersion is chosen based on best guess. Other fields can be used if appropriate.
return (fileVersion != string.Empty);
来自参考源的引用(评论他们的意思)意味着如果其fileVersion
成员为空(该块的成员,而不是标题中的成员),该函数将放弃另外正确猜测的特定于代码页的版本信息,这增加了混乱)。
您的exe文件就是这种情况:
当我们修改框架以使用它时......
return (productVersion != string.Empty);
...它按预期工作(在控制台和Windows应用程序中都经过测试):
所以有两个选择:
答案 2 :(得分:1)
最后我找到了解决方案:
1。首先安装以下软件包:
# example data:
dat <- data.frame(row=seq_len(10000),id=seq_len(10000))
# sample away!
dat[sample(seq_len(nrow(dat)), c(nrow(dat),1.5e4,2e4)[cut(nrow(dat), c(0,1e4,5e4,Inf))]),]
它有一个依赖包,Nuget自动安装Microsoft.WindowsAPICodePack.Shell
2. 现在我们可以获取文件属性,如下面的代码
Microsoft.WindowsAPICodePack.Core