在内存中创建一个“目录”?

时间:2015-05-10 09:42:07

标签: c# .net temporary-files

我正在使用c#,并且正在寻找一种方法来创建一个目录的路径,该路径将映射到IO.Stream而不是实际的文件系统。
我希望能够将文件“保存”到该路径,操作内容或文件名,然后将它们从该路径保存到文件系统中的常规文件。

我知道我可以使用临时文件,但我宁愿使用内存来保证安全性和性能。

使用according to this answer类在Java中存在FileSystemProvider这类内容。我正在寻找一种在c#中实现它的方法。

我尝试了所有我能想到的搜索,并且只提供了java答案和使用临时文件的建议。
甚至可以使用.net?

基本上,我正在寻找一种方法来启用将文件直接保存到内存,就好像它们保存到文件系统中一样。 所以,例如,如果我有第三方类暴露了保存方法(save(string fullPath)),或类似SmtpServer.Send(MyMsg) in this question,我可以选择该路径并将其保存到内存流而不是驱动器。 (这里的主要内容是我想提供一个直接导致path)的memory stream

2 个答案:

答案 0 :(得分:8)

.NET在主机操作系统的文件系统上没有抽象层。因此,除非您可以构建自己的自定义代码,并且需要覆盖第三方库,否则只有两个可行的optilns:

  • 使用流并避免任何使用文件名的API。
  • 构建插入主机操作系统存储架构的虚拟文件系统;然而,所需的努力与福利是非常值得怀疑的。

答案 1 :(得分:0)

我最近也遇到过类似的情况,尽管我使用了对我有效且安全的解决方法,但.NET中没有开箱即用的解决方案。

使用Ionic.Zip Nuget包,您可以创建一个结构复杂的整个目录作为内存中的流,尽管它将创建为zip文件,但是您可以将其提取为流,甚至可以将zip文件作为流。

    using (var zip = new Ionic.Zip.ZipFile())
                {
                    zip.AddEntry($"file1.json", new MemoryStream(Encoding.UTF8.GetBytes(someJsonContent)));

                        for (int i = 0; i < 4; i++)
                        {
                            zip.AddEntry($"{myDir}/{i}.json", new MemoryStream(Encoding.UTF8.GetBytes(anotherJsonContent)));
                        }
                }

这是如何extract a zip file as a stream using Ionic.Zip