2010-12-01 14 views
9

Estoy almacenando archivos adjuntos en mis aplicaciones.Abrir archivo de la matriz de bytes

Estos se almacenan en SQL como tipos varbinary.

Luego los leo en el objeto byte[].

Ahora necesito abrir estos archivos pero no quiero primero escribir los archivos en el disco y luego abrir usando Process.Start().

Deseo abrir usando en las secuencias de memoria. ¿Hay alguna forma de hacerlo en .net? Tenga en cuenta que estos archivos pueden ser de cualquier tipo

+1

Sí, esto es posible. Yo mismo lo había hecho. ¿Estás preguntando cómo hacer esto? Si es así, publique el código que tiene actualmente y explique sus problemas con él. – Oded

+1

¿Cuál es el propósito concreto de abrir los archivos? Quiero decir, si son de cualquier tipo (.pdf, .png, .exe, .doc, .bat, .wav, .ms3d, lo que sea), ¿qué piensas hacer después de cargarlos en la memoria y para el precesado? los datos apropiadamente? – Flinsch

+1

@Oded: es posible procesar una secuencia de bytes, pero la ejecución de una secuencia de bytes arbitraria en .NET no lo es. Si tú, como yo, nos perdimos la parte 'Process.Start', no hay daño, no hay falta, pero si viste eso y todavía reclamas que se puede hacer, seguiré y preguntaré: ¿CÓMO? – Randolpho

Respuesta

6

MemoryStream tiene un .

Así:

var bytes = GetBytesFromDatabase(); // assuming you can do that yourself 
var stream = new MemoryStream(bytes); 

// use the stream just like a FileStream 

Eso debería hacer casi el truco.

Edit: Aw, mierda, echo de menos la parte Process.Start. Estoy reescribiendo ...

Edición 2:

No se puede hacer lo que quiere hacer. Debe ejecutar un proceso desde un archivo. Tendrás que escribir en el disco; alternativamente, la respuesta al this question tiene una sugerencia muy compleja que podría funcionar, pero que probablemente no valga la pena.

+0

gracias por todas sus respuestas rápidas. Por lo que deduzco es que, para poder abrir el archivo adjunto almacenado desde db, tendré que escribirlo en el disco y abrir el archivo utilizando el método Process.Start(). Mi único problema con esto fue que tendré que asegurarme de que el usuario tenga acceso de escritura a la ruta donde colocaré el archivo y tampoco estoy seguro de cómo voy a detectar que el usuario ha cerrado el archivo para poder eliminar el archivo de disco. – Amitesh

+0

Para dar un trasfondo sobre lo que estoy tratando de hacer es lo siguiente: – Amitesh

+0

Mi aplicación winforms permite a los usuarios registrar casos y con el caso pueden guardar archivos adjuntos (estos se almacenan en la base de datos SQL). Más tarde, pueden abrir los archivos adjuntos haciendo doble clic en la cuadrícula. Entonces mi pregunta es cuál es la mejor manera de abrir los archivos adjuntos. No hubiera preferido abrirlo guardando en disco y luego abriendo. Ya que voy a venir, ¿cómo debo hacer la limpieza, ya que no quiero que estos archivos queden en las unidades locales de los usuarios? – Amitesh

11

Puede escribir todos los bytes a presentar sin usar Streams:

System.IO.File.WriteAllBytes(path, bytes); 

Y a continuación, utilizar simplemente

Process.Start(path); 

intentar abrir el archivo de la memoria es no vale la pena el resultado. Realmente, no quieres hacerlo.

+3

El interlocutor ya indicó que no quería hacer esto. – Randolpho

+0

@Randolpho vuelve a leer la búsqueda, y resulta que tienes razón. Respuesta actualizada –

1

Mi único problema con esto era que voy a tener que asegurarse de que el usuario tiene acceso a la ruta donde voy a colocar el archivo ...

Debe estar capaz de garantizar que la devolución de Path.GetTempFileName es algo a lo que su usuario tiene acceso.

... y tampoco estoy seguro de cómo voy a detectar que el usuario ha cerrado el archivo para poder eliminar el archivo del disco.

Si inicia el proceso con Process.Start(...), ¿no debería ser capaz de controlar cuando finaliza el proceso?

1

Si absolutamente no desea escribir en el disco usted mismo, puede implementar el servidor HTTP local y servir attachemnts a través de HTTP (como http://localhost:3456/myrecord123/attachment1234.pdf). Además, no estoy seguro de si obtiene suficientes beneficios para realizar un trabajo no trivial. Abrirá archivos desde la zona de seguridad local que es ligeramente mejor que abrir desde el disco ... y no necesita escribir usted mismo en el disco. Y es probable que reciba una advertencia razonable si tiene el archivo .exe como archivo adjunto.

En el seguimiento del "proceso realizado con el archivo adjunto" tiene más o menos suerte: solo en algunos casos el proceso que comenzó a abrir el archivo es el que realmente lo está utilizando. Es decir. Las aplicaciones de Office suelen ser aplicaciones de una sola instancia y, como resultado, el documento estará abierto en la primera instancia de la aplicación, no en el que ha iniciado.

Cuestiones relacionadas