C# - Check if File is Text Based
如何测试使用文件流在C中打开的文件是否为"文本类型"文件?我希望我的程序打开任何基于文本的文件,例如,.txt,.html等。
但不能打开.doc或.pdf或.exe等。
总的来说:没有办法知道。
如果用8位编码打开一个以UTF-16格式存储的文本文件,它可能看起来像二进制文件。同样,有人可以将文本文件保存为
虽然您可以打开文件并查看一些内容,但所有这些启发式方法有时都会失败(例如,记事本尝试这样做,通过仔细选择几个字符,记事本会猜错并显示完全不同的内容)。
如果您有一个特定的场景,而不是能够打开和处理任何事情,那么您应该能够做得更好。
我想您可以检查前1000个(任意数字)字符,看看是否有不可打印的字符,或者它们是否都是某个范围内的ASCII字符。如果是后者,假设它是文本?
不管你做什么都是一个猜测。
要获得真正的文件类型,必须检查文件头,即使扩展名被修改,它也不会被更改。您可以在此处获取标题列表,并在代码中使用类似的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | using(var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { using(var reader = new BinaryReader(stream)) { // read the first X bytes of the file // In this example I want to check if the file is a BMP // whose header is 424D in hex(2 bytes 6677) string code = reader.ReadByte().ToString() + reader.ReadByte().ToString(); if (code.Equals("6677")) { //it's a BMP file } } } |
我有一个适用于我的下面的解决方案。这是检查所有类型的二进制文件的一般解决方案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | /// <summary> /// This method checks whether selected file is Binary file or not. /// </summary> public bool CheckForBinary() { Stream objStream = new FileStream("your file path", FileMode.Open, FileAccess.Read); bool bFlag = true; // Iterate through stream & check ASCII value of each byte. for (int nPosition = 0; nPosition < objStream.Length; nPosition++) { int a = objStream.ReadByte(); if (!(a >= 0 && a <= 127)) { break; // Binary File } else if (objStream.Position == (objStream.Length)) { bFlag = false; // Text File } } objStream.Dispose(); return bFlag; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public bool IsTextFile(string FilePath) using (StreamReader reader = new StreamReader(FilePath)) { int Character; while ((Character = reader.Read()) != -1) { if ((Character > 0 && Character < 8) || (Character > 13 && Character < 26)) { return false; } } } return true; } |