您可以使用几种方法来“最佳猜测”该文件是否为文本文件。当然,您支持的编码越多,这就越难,特别是如果计划支持 CJK(中文、日文、韩文)脚本。让我们从Encoding.Ascii
现在开始Encoding.UTF-8
。
幸运的是,大多数非文本文件(可执行文件、图像等)在其前几 KB中都有很多不可解析的字符。
您可以做的是获取一个文件并扫描前 1-4KB(由您决定),看看是否出现任何“不可打印”字符。此操作不会花费太多时间,并且至少可以让您确定文件的内容。
public static async Task<bool> IsValidTextFileAsync(string path,
int scanLength = 4096)
{
using(var stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read))
using(var reader = new StreamReader(stream, Encoding.UTF8))
{
var bufferLength = (int)Math.Min(scanLength, stream.Length);
var buffer = new char[bufferLength];
var bytesRead = await reader.ReadBlockAsync(buffer, 0, bufferLength);
reader.Close();
if(bytesRead != bufferLength)
throw new IOException("There was an error reading from the file.");
for(int i = 0; i < bytesRead; i++)
{
var c = buffer[i];
if(char.IsControl(c))
return false;
}
return true;
}
}