是文件可读的(包含文本而非可访问)

Jbo*_*han 9 c# string algorithm text file

我正在研究一个从本地Hdd读取所有文件的项目,我指定了我想要包含在搜索中的扩展名.

所有选择的文件扩展都基于文件是文本内容的事实.

所以对于我的使用,我可以指定要进入帐户的扩展名,例如.cs .html .htm .css .js等'

如果我想添加一个功能,让通用用户选择扩展,让他从所有可用的Windows文件扩展名中选择,但在该列表中只包含那些文本中的文件.例如我们知道exe,mp3.mpg,avi不是,但他可能有一些我们没有考虑的其他类型的文件(.extensions).

有没有办法决定,基于系统文件属性,如果没有什么会的方式来筛选纯文本文件的内容?

drf*_*drf 3

Windows 计算机的一种机制是在 Windows 注册表中查找与文件扩展名关联的内容类型。(我不知道有什么方法可以在不直接查找注册表的情况下执行此操作。)

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

  • 指示 MIME 主要文本类型的内容类型,例如,text/plaintext/application
  • 一种感知类型text
  • 具有 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;
                }

            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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