从字节数组打开文件

时间:2010-12-01 19:08:19

标签: c# .net file

我在我的应用程序中存储附件。

这些以varbinary类型存储在SQL中。

然后我将它们读入byte[]对象。

我现在需要打开这些文件,但不想先将文件写入磁盘,然后使用Process.Start()打开。

我想使用内存流打开。在.net中有没有办法解决这个问题。请注意,这些文件可以是任何类型

5 个答案:

答案 0 :(得分:12)

您可以在不使用Streams的情况下将所有字节写入文件:

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

然后使用

Process.Start(path);

尝试从内存中打开文件不值得。真的,你不想这样做。

答案 1 :(得分:8)

MemoryStream有一个constructor that takes a Byte array

所以:

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

// use the stream just like a FileStream

这应该可以解决问题。

编辑:噢,废话,我完全错过了Process.Start部分。我正在改写......

编辑2:

你无法做你想做的事。您必须从文件执行进程。你必须写入磁盘;或者,this question的答案有一个非常复杂的建议,可能有效,但可能不值得努力。

答案 2 :(得分:1)

答案 3 :(得分:1)

  

我唯一的问题是我必须确保用户对我将放置文件的路径有写入权限...

您应该可以保证Path.GetTempFileName的退回是您的用户可以访问的内容。

  

...而且我也不确定如何检测到用户已关闭文件,以便我可以从磁盘中删除该文件。

如果您使用Process.Start(...)启动流程,您是否应该能够监控流程何时终止?

答案 4 :(得分:1)

如果您绝对不想自己写入磁盘,则可以实现本地HTTP服务器并通过HTTP提供attachemnts(如http://localhost:3456/myrecord123/attachment1234.pdf)。 此外,我不确定你是否从这项非平凡的工作中获得足够的好处。您将从本地安全区域打开文件,稍微好一点,然后从磁盘打开...并且不需要自己写入磁盘。如果你有.exe文件作为附件,你可能会得到一些合理的警告。

在跟踪“使用附件完成的过程”时,您或多或少运气不好:仅在某些情况下,开始打开文件的进程才是实际使用它的进程。即Office应用程序通常是单实例应用程序,因此结果文档将在应用程序的第一个实例中打开,而不是您已启动的应用程序。