2011-06-13 17 views
7

Tengo un FileStream que consiste en varios archivos puestos en un archivo, y tengo una lista de las longitudes de los archivos, en otras palabras, puedo calcular fácilmente la posición y la longitud de todos los archivos. Lo que quiero crear es un método abierto que tome un índice de archivo y devuelva una secuencia que contenga solo ese archivo. Actualmente lo he implementado usando un flujo de memoria, pero eso me obliga a copiar el archivo completo (no el contenedor, sino todo el contenido) en la memoria, y no quiero hacer eso. Entonces, lo que me gustaría hacer es crear una clase que implemente la transmisión y tome otra secuencia, un desplazamiento y un parámetro de longitud, y luego sea legible y buscable, solo cuando lo haga Seek (0) debería obtener la compensación de la corriente subyacente. Así que como una clase de adaptador, y me preguntaba si esto era posible, o incluso una buena idea, o si alguien tiene alguna idea mejor de cómo resolver este problema. Me doy cuenta de que si lo hago de la manera que acabo de describir, necesito asegurarme de que el acceso a la corriente subyacente esté sincronizado y de que todas las transmisiones parciales abiertas contengan una variable privada que les indique dónde se encuentran actualmente en la transmisión, pero esto debería ser factible, ¿no? ¿Alguien ha hecho algo como esto antes? ¿O hay una clase simpel .NET que puedo usar? Cualquier ayuda sería apreciada.Crear un FileStream parcial (o limitado) en C#

Ah, y lo siento por el mal inglés, me olvidé de instalar mi navegador en inglés, así que el corrector ortográfico me dice que todo está mal.

Respuesta

2

Si está utilizando .NET 4.0, puede usar memory-mapped files. Hacen más o menos lo que usted describió: puede asignar una "vista" de un archivo grande, especificado por un desplazamiento y una longitud, a la memoria, y acceder solo a esa parte del archivo usando un Stream.

De lo contrario, creo que su enfoque suena bien. ¡Solo tenga cuidado con los casos de esquina que implican leer o escribir más allá de los límites del archivo previsto!