Jbo*_*han 9 c# string algorithm text file
我正在研究一个从本地Hdd读取所有文件的项目,我指定了我想要包含在搜索中的扩展名.
所有选择的文件扩展都基于文件是文本内容的事实.
所以对于我的使用,我可以指定要进入帐户的扩展名,例如.cs .html .htm .css .js等'
如果我想添加一个功能,让通用用户选择扩展,让他从所有可用的Windows文件扩展名中选择,但在该列表中只包含那些文本中的文件.例如我们知道exe,mp3.mpg,avi不是,但他可能有一些我们没有考虑的其他类型的文件(.extensions).
有没有办法决定,基于系统文件属性,如果没有什么会的方式来筛选纯文本文件的内容?
Windows 计算机的一种机制是在 Windows 注册表中查找与文件扩展名关联的内容类型。(我不知道有什么方法可以在不直接查找注册表的情况下执行此操作。)
在注册表中,基于文本的文件扩展名通常应具有以下一个或多个特征:
text/plain
或text/application
text
{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、.. 。
虽然这取决于应用程序安装程序正确映射文件扩展名,但它似乎可以识别大多数主要文本文件类型。