我在我的应用程序中存储附件。
这些以varbinary
类型存储在SQL中。
然后我将它们读入byte[]
对象。
我现在需要打开这些文件,但不想先将文件写入磁盘,然后使用Process.Start()
打开。
我想使用内存流打开。在.net中有没有办法解决这个问题。请注意,这些文件可以是任何类型
答案 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)
MemoryMappedFile?
http://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile.aspx
答案 3 :(得分:1)
我唯一的问题是我必须确保用户对我将放置文件的路径有写入权限...
您应该可以保证Path.GetTempFileName
的退回是您的用户可以访问的内容。
...而且我也不确定如何检测到用户已关闭文件,以便我可以从磁盘中删除该文件。
如果您使用Process.Start(...)
启动流程,您是否应该能够监控流程何时终止?
答案 4 :(得分:1)
如果您绝对不想自己写入磁盘,则可以实现本地HTTP服务器并通过HTTP提供attachemnts(如http://localhost:3456/myrecord123/attachment1234.pdf)。 此外,我不确定你是否从这项非平凡的工作中获得足够的好处。您将从本地安全区域打开文件,稍微好一点,然后从磁盘打开...并且不需要自己写入磁盘。如果你有.exe文件作为附件,你可能会得到一些合理的警告。
在跟踪“使用附件完成的过程”时,您或多或少运气不好:仅在某些情况下,开始打开文件的进程才是实际使用它的进程。即Office应用程序通常是单实例应用程序,因此结果文档将在应用程序的第一个实例中打开,而不是您已启动的应用程序。