如何使用FileStream测试我在C#中打开的文件是否是"文本类型"文件?我希望我的程序打开任何基于文本的文件,例如.txt,.html等.
但不要打开.doc或.pdf或.exe等等.
Ric*_*ard 10
一般来说:没有办法说出来.
如果您使用8位编码打开文本文件,则以UTF-16格式存储的文本文件可能看起来像二进制文件.同样有人可以将文本文件保存为.doc(它是文档).
虽然您可以打开文件并查看一些内容,但所有这些启发式方法有时会失败(例如,记事本会尝试这样做,通过仔细选择几个字符记事本会猜错并显示完全不同的内容).
如果你有一个特定的场景,而不是能够打开和处理任何东西,你应该能够做得更好.
正如其他人指出的那样,没有绝对的方法可以确定。然而,为了确定文件是否是二进制文件(可以说比确定文件是否是文本更容易),一些实现会检查连续的 NUL 字符。Git 显然只是检查前 8000 个字符是否为 NUL,如果发现则将该文件视为二进制文件。请参阅此处了解更多详细信息。
这是我编写的一个类似的 C# 解决方案,用于查找给定数量的所需连续 NUL。如果IsBinary返回 false,那么您的文件很可能是基于文本的。
public bool IsBinary(string filePath, int requiredConsecutiveNul = 1)
{
const int charsToCheck = 8000;
const char nulChar = '\0';
int nulCount = 0;
using (var streamReader = new StreamReader(filePath))
{
for (var i = 0; i < charsToCheck; i++)
{
if (streamReader.EndOfStream)
return false;
if ((char) streamReader.Read() == nulChar)
{
nulCount++;
if (nulCount >= requiredConsecutiveNul)
return true;
}
else
{
nulCount = 0;
}
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
我想你可以检查前1000个(任意数字)字符,看看是否有不可打印的字符,或者它们是否都在某个范围内的ascii.如果是后者,假设它是文本?
无论你做什么都是猜测.
| 归档时间: |
|
| 查看次数: |
14126 次 |
| 最近记录: |