utilizado uso txt siendo saber puede proceso porque por otro ocupado obtener net liberar está esta eliminar cerrar archivo acceso abierto c# asp.net iis pdf tiff

c# - uso - ¿Cómo detectar si un archivo es PDF o TIFF?



saber si un archivo esta en uso c# (8)

Por favor, tengan paciencia conmigo, ya que me han lanzado al centro de este proyecto sin saber todo el trasfondo. Si tienes preguntas de WTF, confía en mí, yo también las tengo.

Aquí está el escenario: Tengo un montón de archivos que residen en un servidor IIS. No tienen extensión de archivo en ellos. Solo archivos desnudos con nombres como "asda-2342-sd3rs-asd24-ut57" y así sucesivamente. Nada intuitivo.

El problema es que necesito presentar archivos en una página ASP.NET (2.0) y mostrar los archivos tiff como tiff y los archivos PDF como PDF. Desafortunadamente, no sé cuál es cuál y necesito poder mostrarlos adecuadamente en sus respectivos formatos.

Por ejemplo, digamos que hay 2 archivos que necesito mostrar, uno es tiff y otro es PDF. La página debe aparecer con una imagen tiff, y quizás un enlace que abra el PDF en una nueva pestaña / ventana.

El problema:

Como estos archivos no tienen ninguna extensión, tuve que obligar a IIS a que solo sirviera todo como TIFF. Pero si hago esto, los archivos PDF no se mostrarán. Podría cambiar IIS para forzar que el tipo MIME sea PDF para extensiones de archivo desconocidas, pero tendría el problema inverso.

http://support.microsoft.com/kb/326965

¿Es este problema más fácil de lo que creo o es tan desagradable como esperaba?


De acuerdo, hay suficientes personas que entienden este error de manera que voy a publicar algún código que tengo que identificar TIFF:

private const int kTiffTagLength = 12; private const int kHeaderSize = 2; private const int kMinimumTiffSize = 8; private const byte kIntelMark = 0x49; private const byte kMotorolaMark = 0x4d; private const ushort kTiffMagicNumber = 42; private bool IsTiff(Stream stm) { stm.Seek(0); if (stm.Length < kMinimumTiffSize) return false; byte[] header = new byte[kHeaderSize]; stm.Read(header, 0, header.Length); if (header[0] != header[1] || (header[0] != kIntelMark && header[0] != kMotorolaMark)) return false; bool isIntel = header[0] == kIntelMark; ushort magicNumber = ReadShort(stm, isIntel); if (magicNumber != kTiffMagicNumber) return false; return true; } private ushort ReadShort(Stream stm, bool isIntel) { byte[] b = new byte[2]; _stm.Read(b, 0, b.Length); return ToShort(_isIntel, b[0], b[1]); } private static ushort ToShort(bool isIntel, byte b0, byte b1) { if (isIntel) { return (ushort)(((int)b1 << 8) | (int)b0); } else { return (ushort)(((int)b0 << 8) | (int)b1); } }

Hice algo de código mucho más general para conseguir esto.

Para PDF, tengo un código que se ve así:

public bool IsPdf(Stream stm) { stm.Seek(0, SeekOrigin.Begin); PdfToken token; while ((token = GetToken(stm)) != null) { if (token.TokenType == MLPdfTokenType.Comment) { if (token.Text.StartsWith("%PDF-1.")) return true; } if (stm.Position > 1024) break; } return false; }

Ahora, GetToken () es una llamada a un escáner que convierte un Stream en tokens de PDF. Esto no es trivial, así que no lo voy a pegar aquí. Estoy usando el tokenizer en lugar de mirar la subcadena para evitar un problema como este:

% the following is a PostScript file, NOT a PDF file % you''ll note that in our previous version, it started with %PDF-1.3, % incorrectly marking it as a PDF % clippath stroke showpage

este código está marcado como NO un PDF por el fragmento de código anterior, mientras que un fragmento de código más simplista lo marcará incorrectamente como un PDF.

También debo señalar que la especificación ISO actual carece de las notas de implementación que estaban en la especificación anterior de propiedad de Adobe. Lo más importante de la referencia PDF, versión 1.6:

Acrobat viewers require only that the header appear somewhere within the first 1024 bytes of the file.


Internamente, la información del encabezado del archivo debería ayudar. si abre un archivo de bajo nivel, como StreamReader () o FOPEN (), observe los dos primeros caracteres del archivo ... Casi todos los tipos de archivos tienen su propia firma.

PDF always starts with "%P" (but more specifically would have like %PDF) TIFF appears to start with "II" Bitmap files with "BM" Executable files with "MZ"

También tuve que lidiar con esto en el pasado ... también para ayudar a evitar que los archivos no deseados se carguen en un sitio determinado y abortarlos inmediatamente una vez que se verifican.

EDITAR - Código de muestra publicado para leer y probar tipos de encabezados de archivos

String fn = "Example.pdf"; StreamReader sr = new StreamReader( fn ); char[] buf = new char[5]; sr.Read( buf, 0, 4); sr.Close(); String Hdr = buf[0].ToString() + buf[1].ToString() + buf[2].ToString() + buf[3].ToString() + buf[4].ToString(); String WhatType; if (Hdr.StartsWith("%PDF")) WhatType = "PDF"; else if (Hdr.StartsWith("MZ")) WhatType = "EXE or DLL"; else if (Hdr.StartsWith("BM")) WhatType = "BMP"; else if (Hdr.StartsWith("?_")) WhatType = "HLP (help file)"; else if (Hdr.StartsWith("/0/0/1")) WhatType = "Icon (.ico)"; else if (Hdr.StartsWith("/0/0/2")) WhatType = "Cursor (.cur)"; else WhatType = "Unknown";


Leer la especificación de cada formato de archivo le indicará cómo identificar los archivos de ese formato.

Archivos TIFF : compruebe los bytes 1 y 2 para 0x4D4D o 0x4949 y los bytes 2-3 para el valor ''42''.

La página 13 de la especificación dice:

Un archivo TIFF comienza con un encabezado de archivo de imagen de 8 bytes, que contiene la siguiente información: Bytes 0-1: el orden de bytes utilizado en el archivo. Los valores legales son: “II” (4949.H) “MM” (4D4D.H) En el formato “II”, el orden de bytes siempre es del byte menos significativo al byte más significativo, tanto para 16 bits como para 32 bytes. enteros de bits Esto se denomina orden de bytes little-endian. En el formato "MM", el orden de bytes siempre es del más significativo al menos significativo, tanto para enteros de 16 bits como de 32 bits. Esto se llama orden de bytes big-endian. Bytes 2-3 Un número arbitrario pero cuidadosamente elegido (42) que identifica aún más el archivo como un archivo TIFF. El orden de los bytes depende del valor de los bytes 0-1.

PDF archivos PDF comienzan con la versión PDF seguida de varios bytes binarios. (Creo que ahora tienes que comprar la especificación ISO para la versión actual).

Sección 7.5.2

La primera línea de un archivo PDF será un encabezado que consta de los 5 caracteres% PDF, seguido de un número de versión de la forma 1.N, donde N es un dígito entre 0 y 7. Un lector conforme deberá aceptar archivos con cualquiera de los siguientes encabezados:% PDF – 1.0,% PDF – 1.1,% PDF – 1.2,% PDF – 1.3,% PDF – 1.4,% PDF – 1.5,% PDF – 1.6,% PDF – 1.7 Comenzando con PDF 1.4, la Versión la entrada en el diccionario del catálogo del documento (que se encuentra a través de la entrada Raíz en el tráiler del archivo, como se describe en 7.5.5, "Remolque de archivos"), si está presente, se usará en lugar de la versión especificada en el encabezado.

Si un archivo PDF contiene datos binarios, como la mayoría (ver 7.2, "Convenciones léxicas"), la línea del encabezado irá seguida inmediatamente por una línea de comentarios que contenga al menos cuatro caracteres binarios, es decir, caracteres cuyos códigos son 128 o más. Esto garantiza el comportamiento adecuado de las aplicaciones de transferencia de archivos que inspeccionan los datos cerca del comienzo de un archivo para determinar si se trata el contenido del archivo como texto o como binario.

Por supuesto, usted podría hacer una verificación "más profunda" de cada archivo al verificar más elementos específicos del archivo.


Si vas here , verás que el TIFF generalmente comienza con "números mágicos" 0x49 0x49 0x2A 0x00 (también se dan algunas otras definiciones), que son los primeros 4 bytes del archivo.

Entonces solo use estos primeros 4 bytes para determinar si el archivo es TIFF o no.

EDIT, probablemente es mejor hacerlo de la otra manera, y detectar el PDF primero. Los números mágicos para PDF están más estandarizados: como Plinth amablemente señaló que comienzan con "% PDF" en algún lugar de los primeros 1024 bytes (0x25 0x50 0x44 0x46). source



Tendrá que escribir un ashx para obtener el archivo solicitado.

luego, su manejador debería leer los primeros bytes (más o menos) para determinar cuál es realmente el tipo de archivo: el PDF y los TIFF tienen "números mágicos" al principio del archivo que puede usar para determinar esto, luego configure su Respuesta Encabezados en consecuencia.



puede usar Myrmec para identificar el tipo de archivo; esta biblioteca usa el encabezado de bytes del archivo. esta biblioteca está disponible en el nuget "Myrmec", y este es el repositorio, myrmec también admite el tipo mime, puedes probarlo. Al código le gustará esto:

// create a sniffer instance. Sniffer sniffer = new Sniffer(); // populate with mata data. sniffer.Populate(FileTypes.CommonFileTypes); // get file head byte, may be 20 bytes enough. byte[] fileHead = ReadFileHead(); // start match. List<string> results = sniffer.Match(fileHead);

y obtener mime tipo:

List<string> result = sniffer.Match(head);

string mimeType = MimeTypes.GetMimeType (result.First ());

pero que admiten solo la firma dos "49 49 2A 00" y "4D 4D 00 2A", si tiene más puede agregarse, puede ver el archivo Léame de myrmec para obtener ayuda. myrmec github repo