从字节数组中打开文件

15

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

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

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

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

我想要使用内存流打开。在.NET中有没有办法做到这一点。请注意,这些文件可能是任何类型的。


2
是的,这是可能的。我自己曾经做过。你是在问如何做到这一点吗?如果是,请发布你目前拥有的代码并解释其中的问题。 - Oded
1
打开这些文件的具体目的是什么?我的意思是,如果它们是任何类型的文件(.pdf,.png,.exe,.doc,.bat,.wav,.ms3d,无论什么),在将这些文件加载到内存并适当地处理数据之后,您打算做什么? - Flinsch
1
@Oded:处理字节流是可能的,但在.NET中执行任意字节流是不可能的。如果你和我一样错过了Process.Start部分,那没关系,也没有什么损失,但如果你看到了并且仍然声称可以做到,我会问:怎么做? - Randolpho
@Randolpho - 是的,我错过了 Process.Start 部分... 我的错。 - Oded
5个回答

16

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

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

然后只需使用

Process.Start(path);

试图从内存中打开文件并不值得。实际上,你不想这样做。


@Randolpho 重新阅读了问题,发现你是正确的。已更新答案。 - The Smallest

10

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:

你不能做你想做的事情。你必须从文件中执行一个进程。你必须写入磁盘; 或者,这个问题的答案有一个非常复杂的建议,可能不值得努力。


感谢您的快速回复。根据我的理解,为了打开从数据库中存储的附件,我需要将它写入磁盘,然后使用 Process.Start() 方法打开文件。我的唯一问题是,我必须确保用户对我放置文件的路径具有写访问权限,并且我不确定如何检测到用户已关闭文件,以便我可以从磁盘中删除文件。 - Amitesh
我想先简单介绍一下我要做的事情背景: - Amitesh
我的WinForms应用程序允许用户记录案例,并且他们可以保存附件(这些附件存储在SQL数据库中)。稍后,他们可以通过双击网格来打开附件。所以我的问题是,打开附件文件的最佳方法是什么?我不希望通过将其保存到磁盘然后打开来打开它们。因为我需要进行清理,我不希望这些文件留在用户本地驱动器上。 - Amitesh


1
我的唯一问题是,我必须确保用户对我放置文件的路径具有写访问权限...
您应该能够保证Path.GetTempFileName的返回值是用户可以访问的。
而且我也不确定如何检测用户何时关闭文件,以便我可以从磁盘中删除文件。
如果您使用Process.Start(...)启动进程,难道不应该能够监视进程何时终止吗?

1

如果您绝对不想自己写入磁盘,可以实现本地HTTP服务器并通过HTTP提供附件(例如http://localhost:3456/myrecord123/attachment1234.pdf)。

此外,我不确定您是否能从这样的非常规工作中获得足够的好处。您将从本地安全区域打开文件,这比从磁盘打开略好...而且无需自己写入磁盘。如果您有.exe文件作为附件,则可能会收到相当合理的警告。

在跟踪“使用附件完成的进程”方面,您基本上没有什么运气:只有在某些情况下,启动打开文件的进程才是实际使用它的进程。即Office应用程序通常是单实例应用程序,因此文档将在应用程序的第一个实例中打开,而不是您启动的实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接