【问题标题】:open byte-array as file windows forms以文件窗口形式打开字节数组
【发布时间】:2013-09-16 19:59:58
【问题描述】:

在 Windows 窗体应用程序中,我有一个文件存储为 byte[]。

当用户单击按钮时,我想打开文件而不将其保存在本地。这可能吗?如果是那怎么办?

或者我必须将字节数组保存为本地文件然后运行该文件吗?

谢谢,卡尔

【问题讨论】:

  • 文件类型应该是什么?
  • 如果你没有将它保存在任何地方,它就不是一个文件——你只是在内存中获得了一些数据。在这种情况下,您所说的“开放”到底是什么意思?你有什么特别的理由避免保存它吗?
  • 您的意思是要为该数组创建一个流吗? IE。 MemoryStream?这个“文件”最初是如何成为字节数组的?它是一个序列化的对象吗? “打开文件”对您意味着什么?在您的应用程序中打开它,还是使用该扩展程序的默认 Windows 应用程序打开它?如果它是第三方应用程序,除了将其保存在临时文件夹中并在其上调用 Process.Start 之类的东西之外,您无能为力。
  • @keyboardP:文件类型可以变化,但我得到了 mimetype。大多数时候有 pdf 文件或几种图像类型
  • @JonSkeet:我想打开一个文件,就像从 Windows 资源管理器中打开它一样,这样用户就可以查看它,阅读它,......功能应该看起来像“打开文件” - 浏览器中的功能(我知道文件已下载到那里的临时文件夹)

标签: c# arrays winforms file


【解决方案1】:

如果您想在应用程序中打开(就像 Windows 双击具有适当扩展名的文件一样),您必须将其内容写入文件:

/// <summary>
/// Saves the contents of the <paramref name="data"/> array into a 
/// file named <paramref name="filename"/> placed in a temporary folder,
/// and runs the associated application for that file extension
/// in a separate process.
/// </summary>
/// <param name="data">The data array.</param>
/// <param name="filename">The filename.</param>
private static void OpenInAnotherApp(byte[] data, string filename)
{
    var tempFolder = System.IO.Path.GetTempPath();
    filename = System.IO.Path.Combine(tempFolder, filename);
    System.IO.File.WriteAllBytes(filename, data);
    System.Diagnostics.Process.Start(filename);
}

用法:

var someText = "This is some text.";
var data = Encoding.ASCII.GetBytes(someText);

// open in Notepad
OpenInAnotherApp(data, "somename.txt");

请注意,仅扩展名需要文件名,您可能应该使用随机的Guid 或其他名称,并根据已知的 mimetype 附加扩展名。

【讨论】:

  • This answer 具有各种 MIME 类型和文件扩展名的映射。请注意,这并不是真正的双射(我想到了application/octet-stream)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-27
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
相关资源
最近更新 更多