【问题标题】:Display a file from a byte[] or stream显示来自 byte[] 或流的文件
【发布时间】:2009-12-01 08:32:49
【问题描述】:

我有一个将文件内容存储在数据库中的 winforms 应用程序。存储的文件几乎可以是任何类型(word、excel、PDF、文本、图像...),用户可以选择几乎任何类型的文件来加载。

然后用户可以查询数据库,找到一个文件然后打开它。

我从数据库中提取字节数组没有问题,无论是作为流还是字节数组。

理想情况下,我可以直接从字节数组或流中显示文件;目前我将其保存为临时文件,然后打开它:

Process.Start(fileName);

如何从任何字节数组或流文件中显示带有关联应用程序的文件?

【问题讨论】:

    标签: c# winforms stream bytearray


    【解决方案1】:

    在 Windows 中,您唯一的选择就是完全按照您正在做的事情去做。 Outlook、Internet explorer、firefox,都这样做

    【讨论】:

    • 我同意,这是唯一的选择。
    • 嗯,这似乎是共识,对我来说是最简单的选择,它已经编码并运行。唯一的缺点是剩余的临时文件。我无法从我的应用程序中删除它们,因为用户可能会让启动的应用程序打开的时间比我的长。
    • 当您说您将其保存为临时文件时,您的意思是您将文件保存到标准 Windows 临时目录中吗?为此,我使用 GetTempPath (msdn.microsoft.com/en-us/library/…)。这样,windows 将负责清理文件(尽管最终)
    • 实际上我正在使用 Path.GetTempFileName 并将文件类型交换为我拥有的文件类型。所以是的,它在临时目录中。
    • 奇怪的是,Path.GetTempFileName 实际上创建了一个文件,所以如果您要更改扩展名,您可能需要删除“旧”文件
    【解决方案2】:

    也许你想研究一下内存映射文件。

    【讨论】:

      【解决方案3】:

      您可以尝试打开包含它的目录,但这与您现在正在做的事情是一样的。如果操作系统知道相关的应用程序,那么就没有问题了。..

      【讨论】:

        【解决方案4】:

        如果您将文件名与字节流一起存储在数据库中,则可以根据扩展名确定文件类型。在这种情况下有两种选择:

        1. 使用注册表来确定要使用的应用程序。有关这方面的更多信息,请查看bytes.com 上的此对话。
        2. P/Invoke SHGetFileInfo 以确定要使用的应用程序。

        注意:使用这两个选项,您仍然需要将文件数据写入磁盘上的临时文件才能加载它。

        就个人而言,无论如何,我认为您正在做的可能是最简单的选择(除非您想为某些文件类型提供自定义查看器等)

        【讨论】:

          猜你喜欢
          • 2017-01-22
          • 1970-01-01
          • 1970-01-01
          • 2019-03-17
          • 2017-11-08
          • 1970-01-01
          相关资源
          最近更新 更多