如何通过首尾来判断是否为可读的字符格式文件?
大部分情况下,读取文件的头几个字节来检查是否为文本文件,ASCII码的文本文件以0x00开头,UTF-16的文本文件以0xFF,0xFE开头,UTF-8的文本文件以0xEF,0xBB,0xBF开头。 检查是否以null字符结尾,这是文本文件的一个常见特征。
当然也有例外,但这是操作系统默认的常识。
下面展示一些 内联代码片
。
static bool IsTextFile(string filePath)
{
try
{
// 读取文件的头几个字节来检查是否为文本文件
// ASCII码的文本文件以0x00开头,UTF-16的文本文件以0xFF,0xFE开头,UTF-8的文本文件以0xEF,0xBB,0xBF开头。
// 如果是文本文件,则不会抛出异常,否则会抛出异常。
byte[] bytes = new byte[3];
using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
stream.Read(bytes, 0, bytes.Length);
}
// 检查字节序列是否符合文本文件的开头
if (bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) // UTF-8 BOM
return true;
else if (bytes[0] == 0xFF && bytes[1] == 0xFE) // UTF-16 little-endian BOM
return true;
else if (bytes[0] == 0xFE && bytes[1] == 0xFF) // UTF-16 big-endian BOM
return true;
else if (bytes[0] == 0x00 && bytes[1] == 0x00 && bytes[2] == 0x00) // UTF-32 little-endian BOM
return true;
else if (bytes[0] == 0x00 && bytes[1] == 0x00 && bytes[2] == 0xFF && bytes[3] == 0xFE) // UTF-32 big-endian BOM
return true;
else if (bytes[bytes.Length - 1] != 0) // 检查是否以null字符结尾,这是文本文件的一个常见特征。
return true;
}
catch (Exception ex) // 如果在尝试读取文件时发生任何异常,则可能不是文本文件。
{
return false;
}
return false; // 如果以上所有条件都不满足,则可能不是文本文件。
}