【问题标题】:How to open a file in memory?如何打开内存中的文件?
【发布时间】:2011-09-07 19:33:30
【问题描述】:

我已经看到了这个术语,但我真的不明白你是如何在内存中打开文件的。

我将文件写入临时位置的磁盘,但是当某个表单关闭时需要清理,而当它打开时我无法执行此操作。必须清空此文件夹。我想知道如果我在内存中打开文件是否会有所不同?

【问题讨论】:

  • 这完全取决于你在做什么。
  • 我的缩略图显示在右侧 - 用户双击一个,它会打开 pdf 文件。

标签: c# file-io


【解决方案1】:

你可以使用FileStream构造函数的DeleteOnClose参数:

FileStream fs = new FileStream("<Path Here>", FileMode.Create,
    FileAccess.ReadWrite, FileShare.None, 1024, FileOptions.DeleteOnClose);

关闭后文件将被删除。

【讨论】:

    【解决方案2】:

    我认为这意味着将该文件的内容作为一个整体读入内存,然后关闭与该文件的连接。假设它是一个不太大的文件,你可以将它读入一个字节[]:

    byte[] fileContent = File.ReadAllBytes(fileName);
    

    如果是文本文件,则使用

    将其读入字符串
    string fileContent = File.ReadAllText(fileName);
    

    完成后,使用 StreamReader 稍后读取它,就像读取磁盘上的文件一样。

    【讨论】:

      【解决方案3】:
      MemoryStream inMemoryCopy = new MemoryStream();
      using (FileStream fs = File.OpenRead(path))
      {
        fs.CopyTo(inMemoryCopy);
      }
      // Now you can delete the file at 'path' and still have an in memory copy
      

      【讨论】:

      • 阻止它,我们使用的是 .net 3.5,因此我不能使用 fs.copyto
      • 您可以自己轻松复制 CopyTo 扩展方法。在这里搜索。
      • 您的意思是搜索堆栈溢出以复制到扩展方法?
      • 是的,有一些非常好的建议可以模仿 .net 4 中的原始 CopyTo 方法
      • 真的。 Open(..) 类型的方法通常接受文件路径或流作为输入。使用接受流作为参数的方法就可以了。
      【解决方案4】:

      【讨论】:

      • 好主意,但内存映射文件仍然保留它们到原始文件的映射,并在取消映射后将任何内存中的更改写回文件,因此在这种情况下没多大用处。
      猜你喜欢
      • 2014-05-26
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      相关资源
      最近更新 更多