Открыть файл из байтового массива - PullRequest
11 голосов
/ 01 декабря 2010

Я храню вложения в своих приложениях.

Они сохраняются в SQL как varbinary типы.

Затем я читаю их в byte[] объект.

Теперь мне нужно открыть эти файлы, но я не хочу сначала записывать файлы на диск, а затем открывать, используя Process.Start().

Я хотел бы открыть, используя потоки памяти . Есть ли способ сделать это в .net. Обратите внимание, что эти файлы могут быть любого типа

Ответы [ 5 ]

12 голосов
/ 01 декабря 2010

Вы можете записать все байты в файл без использования потоков:

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

А затем просто используйте

Process.Start(path);

Попытка открыть файл из памяти не стоит результатаНа самом деле, вы не хотите это делать.

8 голосов
/ 01 декабря 2010

MemoryStream имеет конструктор , который принимает массив Byte .

Итак:

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

// use the stream just like a FileStream

Это должно в значительной степени помочь.

Редактировать: Ах, дерьмо, я полностью пропустил часть Process.Start.Я переписываю ...

Редактировать 2:

Вы не можете делать то, что хотите.Вы должны выполнить процесс из файла .Вам придется записать на диск;В качестве альтернативы, ответ на на этот вопрос содержит очень сложное предположение, которое может сработать, но, вероятно, не стоит затраченных усилий.

1 голос
/ 03 декабря 2010

Если вы абсолютно не хотите записывать на диск самостоятельно, вы можете внедрить локальный HTTP-сервер и обслуживать аттестатов через HTTP (например, http://localhost:3456/myrecord123/attachment1234.pdf).). Также я не уверен, что вы получите достаточно преимуществ, выполняя такие нетривиальные задачи.работать. Вы будете открывать файлы из локальной зоны безопасности, что немного лучше, чем открывать с диска ... и вам не нужно записывать на диск самостоятельно. И вы, скорее всего, получите несколько разумных предупреждений, если у вас есть файл .exe в качестве вложения.

При отслеживании «процесса, выполненного с вложением», вам более или менее не повезло: только в некоторых случаях процесс, который начал открывать файл, является тем, который фактически использует его. Т.е. приложения Office обычно являются одним экземпляромприложения, и в результате документ будет открыт в первом экземпляре приложения, а не в том, который вы запустили.

1 голос
/ 02 декабря 2010

Моя единственная проблема с этим состояла в том, что я должен убедиться, что у пользователя есть доступ на запись к пути, куда я буду помещать файл ...

Вы должны быть в состояниигарантировать, что возврат Path.GetTempFileName - это то, к чему имеет доступ ваш пользователь.

... а также не уверен, как я обнаружу, что пользователь закрылфайл, чтобы я мог удалить файл с диска.

Если вы запустите процесс с Process.Start(...), разве вы не сможете отслеживать, когда процесс завершится?

1 голос
/ 01 декабря 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...