我正在我的应用程序中存储附件。
这些附件以varbinary
类型存储在SQL中。
然后,我将它们读入byte[]
对象中。
现在我需要打开这些文件,但不想先将文件写入磁盘,然后使用Process.Start()
打开。
我想要使用内存流打开。在.NET中有没有办法做到这一点。请注意,这些文件可能是任何类型的。
您可以在不使用流的情况下将所有字节写入文件:
System.IO.File.WriteAllBytes(path, bytes);
然后只需使用
Process.Start(path);
试图从内存中打开文件并不值得。实际上,你不想这样做。
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:
你不能做你想做的事情。你必须从文件中执行一个进程。你必须写入磁盘; 或者,这个问题的答案有一个非常复杂的建议,可能不值得努力。
Path.GetTempFileName
的返回值是用户可以访问的。Process.Start(...)
启动进程,难道不应该能够监视进程何时终止吗?如果您绝对不想自己写入磁盘,可以实现本地HTTP服务器并通过HTTP提供附件(例如http://localhost:3456/myrecord123/attachment1234.pdf)。
此外,我不确定您是否能从这样的非常规工作中获得足够的好处。您将从本地安全区域打开文件,这比从磁盘打开略好...而且无需自己写入磁盘。如果您有.exe文件作为附件,则可能会收到相当合理的警告。
在跟踪“使用附件完成的进程”方面,您基本上没有什么运气:只有在某些情况下,启动打开文件的进程才是实际使用它的进程。即Office应用程序通常是单实例应用程序,因此文档将在应用程序的第一个实例中打开,而不是您启动的实例。
Process.Start
部分,那没关系,也没有什么损失,但如果你看到了并且仍然声称可以做到,我会问:怎么做? - RandolphoProcess.Start
部分... 我的错。 - Oded