gpt4 book ai didi

c# - 文件是否可读(包含文本而不是可访问的)

转载 作者:太空狗 更新时间:2023-10-29 17:57:02 27 4
gpt4 key购买 nike

我正在做一个从本地硬盘读取所有文件的项目,我指定了我想包含在搜索中的扩展名。

所有选择的文件扩展名都是基于文件是文本内容这一事实。

所以对于我的使用,我可以指定要考虑的扩展,例如 .cs .html .htm .css .js 等'

如果我想添加一个让普通用户选择扩展的功能怎么办并让他从所有可用的 Windows 文件扩展名中进行选择,但在该列表中仅包括他系统中的文本文件。例如我们知道exe、mp3。 mpg, avi 不是但他可能有一些我们没有考虑到的其他类型的文件(.extensions)。

有没有办法根据系统文件属性来决定,如果不是什么方法只过滤文本内容文件?

最佳答案

Windows 机器的一种机制是在 Windows 注册表中查找与文件扩展名关联的内容类型。 (如果不直接查找注册表,我不知道有什么方法可以做到这一点。)

在注册表中,基于文本的文件扩展名通常应具有以下一个或多个特征:

  • 表示 MIME 主要文本类型的内容类型,例如 text/plaintext/application
  • 一种感知类型的文本
  • 具有 GUID {5e941d80-bf96-11cd-b579-08002b30bfeb} 的默认处理程序,分配给纯文本持久处理程序。

以下方法将返回与这些特征关联的所有系统扩展:

// include using reference to Microsoft.Win32;
static IEnumerable<string> GetTextExtensions()
{
var defaultcomp = StringComparison.InvariantCultureIgnoreCase;
var root = Registry.ClassesRoot;
foreach (var s in root.GetSubKeyNames()
.Where(a => a.StartsWith(".")))
{
using (RegistryKey subkey = root.OpenSubKey(s))
{
if (subkey.GetValue("Content Type")?.ToString().StartsWith("text/", defaultcomp) == true)
yield return s;
else if (subkey.GetValue("PerceivedType")?.ToString().Equals("text", defaultcomp) == true)
yield return s;
else
{
using (var ph = subkey.OpenSubKey("PersistentHandler"))
{
if (ph?.GetValue("")?.ToString().Equals("{5e941d80-bf96-11cd-b579-08002b30bfeb}", defaultcomp) == true)
yield return s;
}

}
}
}
}

输出取决于工作站配置,但在我当前的机器上返回:

.a, .AddIn, .ans, .asc, .asm, .asmx, .aspx, .asx, .bas, .bat, .bcp, .c, .cc, .cd, .cls, .cmd, ...

虽然这取决于应用程序安装程序正确映射文件扩展名,但它似乎可以识别大多数主要文本文件类型。

关于c# - 文件是否可读(包含文本而不是可访问的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33712106/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com