如何在内存中打开文件?

23

我看到这个术语被频繁提及,但我不太明白如何在内存中打开文件。

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


1
这完全取决于你正在做什么。 - SLaks
我在右侧显示缩略图 - 用户双击其中一个,它会打开PDF文件。 - rik
4个回答

60
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。 - rik
你的意思是在 Stack Overflow 上搜索复制到扩展方法吗? - rik
是的,有一些非常好的建议可以模仿 .net 4 中的原始 CopyTo 方法。 - Teoman Soygul
文件流变成输入,内存流变成输出,对吧?那我怎么显示这个文件呢?抱歉我有点困惑! - rik
1
真实的。Open(..) 类型的方法通常接受文件路径或流作为输入。如果使用接受流作为参数的方法,那么你就可以开始了。 - Teoman Soygul
显示剩余2条评论

5

2
思路不错,但是内存映射文件仍然保留其对原始文件的映射,并在取消映射后将任何内存中的更改写回文件,因此在这种情况下并不是很有用。 - Teoman Soygul

4
您可以使用FileStream构造函数的DeleteOnClose参数:
FileStream fs = new FileStream("<Path Here>", FileMode.Create,
    FileAccess.ReadWrite, FileShare.None, 1024, FileOptions.DeleteOnClose);

并且当文件关闭时,该文件将被删除。


3

我认为这意味着将文件内容全部读入内存,然后关闭文件连接。假设这是一个不太大的文件,你可以直接将其读入byte[]中:

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

如果它是一个文本文件,使用以下方法将其读入字符串中:
string fileContent = File.ReadAllText(fileName);

完成上述步骤后,您可以使用StreamReader来读取它,就像在磁盘上读取文件一样。


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