C # - Проверьте, если файл на основе текста - PullRequest
12 голосов
/ 20 января 2011

Как я могу проверить, является ли файл, который я открываю в C # с помощью FileStream, файлом "текстового типа"?Я хотел бы, чтобы моя программа открывала любой текстовый файл, например, .txt, .html и т. Д.

, но не открывала такие файлы, как .doc или .pdf или .exe и т. Д.

Ответы [ 5 ]

10 голосов
/ 20 января 2011

В общем: нет способа узнать.

Текстовый файл, хранящийся в UTF-16, скорее всего будет выглядеть как двоичный, если вы откроете его с 8-битной кодировкой.Точно так же кто-то может сохранить текстовый файл как .doc (это документ).

Хотя вы можете открыть файл и посмотреть на часть содержимого, все такие эвристики иногда не работают (например, блокнот пытаетсясделайте это, осторожно выбрав несколько символов, блокнот угадает неверно и отображает совершенно другой контент.намного лучше.

6 голосов
/ 20 января 2011

Полагаю, вы могли бы просто проверить первые 1000 (произвольное число) символов и посмотреть, есть ли непечатаемые символы или все они находятся в определенном диапазоне. Если последнее, предположим, что это текст?

Что бы вы ни делали, это будет предположение.

2 голосов
/ 20 января 2011

Чтобы получить реальный тип файла, вы должны проверить его заголовок, который не будет изменен, даже если расширение будет изменено. Вы можете получить список заголовков здесь и использовать что-то вроде этого в своем коде:

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 голос
/ 15 мая 2017

У меня есть следующее решение, которое работает для меня. Это общее решение, которое проверяет все типы двоичных файлов.

     /// <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;                   
     }
0 голосов
/ 18 июля 2017
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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...