С# - проверить, является ли файл текстовым
Как проверить, является ли файл, который я открываю в С# с помощью FileStream, является файлом типа "текст"? Я хотел бы, чтобы моя программа открывала любой файл, основанный на тексте, например .txt,.html и т.д.
Но не открывайте такие вещи, как .doc или .pdf или .exe и т.д.
Ответы
Ответ 1
Я думаю, вы могли бы просто проверить первые 1000 (произвольное число) символов и посмотреть, есть ли непечатаемые символы или все они ascii в определенном диапазоне. Если последнее, предположите, что это текст?
Что бы вы ни делали, это будет предположение.
Ответ 2
В общем: нет способа сказать.
Текстовый файл, хранящийся в UTF-16, скорее всего будет выглядеть двоичным, если вы откроете его с 8-битной кодировкой. Точно так же кто-то мог сохранить текстовый файл как .doc
(это документ).
Пока вы можете открыть файл и посмотреть на какой-то контент, все такие эвристики будут иногда терпеть неудачу (например, блокнот пытается это сделать, тщательно отбирая несколько символов, блокнот будет ошибаться и отображать совершенно другой контент).
Если у вас есть определенный сценарий, а не возможность открывать и обрабатывать что-либо, вы должны быть в состоянии сделать гораздо лучше.
Ответ 3
Чтобы получить реальный тип файла, вы должны проверить его заголовок, который не будет изменен, даже если расширение изменено. Вы можете получить заголовок здесь и использовать в своем коде что-то вроде этого:
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 a BMP file
}
}
}
Ответ 4
У меня есть решение ниже, которое работает для меня. Это общее решение, которое проверяет все типы двоичного файла.
/// <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;
}
Ответ 5
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;
}