2009-12-01 2 views
1

У меня есть приложение winforms, которое хранит содержимое файлов в базе данных. Сохраненные файлы могут быть примерно любого типа (слова, Excel, PDF, текст, изображение ...), пользователь может выбрать практически любой загружаемый файл.Показать файл из байт [] или поток

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

У меня нет проблем с извлечением массива байтов из базы данных в виде потока или массива байтов.

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

Process.Start(fileName); 

Как я могу отобразить файл с помощью соответствующего приложения либо из любого из массива байтов или файла потока?

ответ

3

В окнах ваш единственный вариант - сделать именно то, что вы делаете. Outlook, Internet explorer, firefox, все это делает

+1

Я согласен, это единственный вариант. – Jochen

+0

Ну, это похоже на консенсус и самый простой вариант для меня, он уже закодирован и работает. Единственный недостаток - это оставшиеся временные файлы. Я не могу удалить их из своего приложения, так как пользователь может оставить запущенное приложение открытым дольше, чем мое. – baralong

+0

Когда вы говорите, что вы сохраняете его как временный файл, вы имеете в виду, что вы сохраняете файл в стандартном временном каталоге Windows? Для этого я использую GetTempPath (http://msdn.microsoft.com/en-us/library/system.io.path.gettemppath.aspx). Таким образом, окна будут ответственны за очистку файла (хотя и в конечном итоге) –

0

Возможно, вы хотите немного исследовать файл с памятью.

0

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

0

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

  1. Используйте реестр, чтобы определить, какое приложение использовать. Для получения дополнительной информации об этом, взгляните на этот разговор на bytes.com.
  2. P/Invoke SHGetFileInfo, чтобы определить, какое приложение использовать.

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

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

Смежные вопросы