2010-12-01 22 views
9

Ich speichere Anhänge in meinen Anwendungen.Datei aus Bytearray öffnen

Diese werden in SQL als varbinary Typen gespeichert.

Ich lese sie dann in byte[] Objekt.

Ich muss jetzt diese Dateien öffnen, aber nicht zuerst die Dateien auf die Festplatte schreiben und dann öffnen mit .

Ich möchte mit inmemory Streams öffnen. Gibt es einen Weg dazu in .net. Bitte beachten Sie, dass diese Dateien von jedem Typ sein können.

+1

Ja, das ist möglich. Ich hatte es selbst getan. Fragen Sie, wie man das macht? Wenn ja, poste bitte den Code, den du gerade hast, und erkläre deine Probleme damit. – Oded

+1

Was ist der konkrete Zweck, um die Dateien zu öffnen? Ich meine, wenn sie irgendwelcher Art sind (.pdf, .png, .exe, .doc, .bat, .wav, .ms3d, was auch immer), was planen Sie nach dem Laden der Dateien in den Speicher und für die Bearbeitung die Daten angemessen? – Flinsch

+1

@Oded: die Verarbeitung eines Bytestreams ist möglich, aber die Ausführung eines beliebigen Bytestreams in .NET ist nicht möglich. Wenn Sie, wie ich, den 'Process.Start'-Teil verpasst haben, kein Schaden, kein Foul, aber wenn Sie das gesehen haben und immer noch behaupten, dass es getan werden kann, werde ich weitermachen und fragen: WIE ?? – Randolpho

Antwort

6

MemoryStream hat eine .

So:

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

// use the stream just like a FileStream 

Das ist ziemlich viel sollte es tun.

Edit: Aw, Mist, ich habe total den Process.Start Teil verpasst. Ich Umschreiben ...

Edit 2:

Sie können nicht tun, was Sie tun wollen. Sie müssen einen Prozess aus einer Datei ausführen. Sie müssen auf die Festplatte schreiben; alternativ hat die Antwort auf this question einen sehr komplexen Vorschlag, der funktionieren könnte, aber wahrscheinlich nicht die Mühe wert wäre.

+0

danke für alle deine schnellen Antworten. Also von dem, was ich sammle ist, dass für mich, um die gespeicherte angehängt von db zu öffnen, muss ich es auf die Festplatte schreiben und sie öffnen die Datei mit der Process.Start() -Methode. Mein einziges Problem mit diesem war, dass ich sicherstellen muss, dass der Benutzer Schreibzugriff auf den Pfad hat, wo ich die Datei platzieren werde und auch nicht sicher bin, wie ich feststellen werde, dass der Benutzer die Datei geschlossen hat, damit ich die Datei löschen kann Scheibe. – Amitesh

+0

Um einen Hintergrund zu geben, was ich versuche zu tun, ist das folgende: – Amitesh

+0

Meine Winforms-Anwendung ermöglicht es Benutzern, Fälle zu protokollieren und mit dem Fall, dass sie Anlagen speichern können (diese werden in der SQL DB gespeichert). Später können sie die Anhänge öffnen, indem sie auf das Raster doppelklicken. Also meine Frage ist, was der beste Weg ist, um die Anhangsdateien zu öffnen. Ich hätte es nicht vorgezogen, sie zu öffnen, indem ich sie auf Festplatte speicherte und dann öffnete. Da werde ich kommen, wie müssen Sie die Aufräumarbeiten tun, wie ich nicht will, dass diese Dateien auf Benutzer lokale Laufwerke – Amitesh

11

Sie können alle Bytes schreiben, ohne Datei-Streams zu verwenden:

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

Und dann benutzen Sie einfach

Process.Start(path); 

Versuch Datei aus dem Speicher zu öffnen, ist das Ergebnis nicht wert. Wirklich, du willst es nicht tun.

+3

Der Fragesteller bereits erklärt, er wollte dies nicht tun. – Randolpho

+0

@Randolpho las die Quest noch einmal und es stellte sich heraus, dass du Recht hast. Aktualisierte Antwort –

1

Mein einziges Problem mit diesem war, dass ich muss der Benutzer sicherstellen, hat Zugriff auf den Pfad schreiben, wo ich die Datei platzieren wird ...

Sie sollten sein kann garantieren, dass die Rückgabe von Path.GetTempFileName etwas ist, auf das Ihr Benutzer Zugriff hat.

... und bin mir auch nicht sicher, wie ich feststellen werde, dass der Benutzer die Datei geschlossen hat, damit ich die Datei von der Festplatte löschen kann.

Wenn Sie den Prozess mit Process.Start(...) starten, sollten Sie nicht in der Lage sein, zu überwachen, wenn der Prozess beendet wird?

1

Wenn Sie nicht unbedingt selbst auf Festplatte schreiben möchten, können Sie einen lokalen HTTP-Server implementieren und Attachemnts über HTTP (wie http://localhost:3456/myrecord123/attachment1234.pdf) bereitstellen. Auch ich bin mir nicht sicher, ob Sie genug Vorteile bei solchen nicht-trivialen Arbeit bekommen. Sie öffnen Dateien aus der lokalen Sicherheitszone, die etwas besser ist als das Öffnen von der Festplatte ... und Sie müssen nicht selbst auf die Festplatte schreiben. Und Sie werden wahrscheinlich eine angemessene Warnung erhalten, wenn Sie eine .exe-Datei als Anhang haben.

Bei der Verfolgung "Prozess mit dem Anhang getan" Sie mehr oder weniger Pech: nur in einigen Fällen ist der Prozess, der begonnen hat, die Datei zu öffnen, diejenige, die es tatsächlich verwendet. I.e. Office-Anwendungen sind in der Regel One-Instance-Anwendungen, und als Ergebnisdokument wird in der ersten Instanz der Anwendung geöffnet, nicht die, die Sie gestartet haben.