C # – Verificar si el archivo está basado en texto

¿Cómo puedo probar si un archivo que estoy abriendo en C # usando FileStream es un archivo de “tipo de texto”? Me gustaría que mi progtwig abra cualquier archivo que esté basado en texto, por ejemplo, .txt, .html, etc.

Pero no se abren cosas como .doc o .pdf o .exe, etc.

Supongo que podría verificar los primeros 1000 caracteres (número arbitrario) y ver si hay caracteres no imprimibles, o si son todos ascii en un cierto rango. Si es este último, supongamos que es texto?

Lo que sea que hagas será una suposición.

En general: no hay forma de saberlo.

Un archivo de texto almacenado en UTF-16 probablemente se verá como binario si lo abre con una encoding de 8 bits. Igualmente, alguien podría guardar un archivo de texto como .doc (es un documento).

Si bien podrías abrir el archivo y mirar algo del contenido, todas esas heurísticas a veces fallarán (por ejemplo, el bloc de notas intenta hacer esto, mediante una cuidadosa selección de algunos caracteres, el bloc de notas adivinará mal y mostrará un contenido completamente diferente).

Si tiene un escenario específico, en lugar de poder abrir y procesar cualquier cosa, debería poder hacerlo mucho mejor.

Para obtener el tipo real de un archivo, debe verificar su encabezado, que no se modificará incluso si se modifica la extensión. Puede obtener la lista de encabezados aquí , y usar algo como esto en su código:

 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 } } } 

Tengo una solución a continuación que funciona para mí. Esta es una solución general que verifica todos los tipos de archivos binarios.

  ///  /// This method checks whether selected file is Binary file or not. ///  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; } 
 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; }