【问题标题】:Create a "directory" in memory?在内存中创建一个“目录”?
【发布时间】:2015-07-20 21:48:48
【问题描述】:

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

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

这种东西存在,according to this answer,在Java 中,使用FileSystemProvider 类。我正在寻找一种在 c# 中执行此操作的方法。

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

基本上,我正在寻找一种将文件直接保存到内存的方法,就像它们保存在文件系统中一样。 因此,例如,如果我有一个公开保存方法 (save(string fullPath)) 或类似 SmtpServer.Send(MyMsg) in this question 的第 3 方类,我可以选择该路径并将其保存到内存流中,而不是保存到驾驶。 (这里主要是我想提供一个path,它会直接导致memory stream)。

【问题讨论】:

  • Dictionary<string, MemoryStream> 将文件名映射到内存流怎么样?
  • 我可能应该让它更清楚,但我想要这样做的原因之一是我可以将文件从外部来源(如 sql 备份或框架类)保存到内存中。我不明白如何使用 Dictionary 让我能够做到这一点。
  • 框架类通常与Stream 对象一起使用,所以你很擅长。至于外部来源,您从他们那里读取数据的方式是什么?如果你举一个具体的例子可能会有所帮助。
  • 我实际上认为这是对 2 个 stackoverflow 问题的可能解决方案:one on how to save mail messages with a specified name 另一个是关于如何确保 sql 备份是由同一软件创建的(我可以'现在找不到)。这种事情在这两种情况下都可能有用。
  • 如果您仍然不喜欢使用Dictionary<string, MemoryStream>,那么您可以相对轻松地为使用MemoryStream 作为文件内容存储的虚拟文件夹和文件创建自己的结构。

标签: c# .net temporary-files


【解决方案1】:

我最近遇到了类似的情况,尽管我使用了一种对我来说既高效又安全的解决方法,但 .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的方法

【讨论】:

    【解决方案2】:

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

    • 使用流并避免使用任何使用文件名的 API。
    • 构建一个插入主机操作系统存储架构的虚拟文件系统;但是,所需要的努力与收益之间的关系是非常值得怀疑的。

    【讨论】:

    • 那么,答案是做不到,那么呢?如果您不介意,我会等一会儿,看看是否有人能提出解决方案,然后再接受您的回答。
    • 不,绝对可以,但工作量很大,需要深入了解文件系统和 Windows 驱动系统的工作原理。
    • 好的。在那种情况下,它,似乎我试图字节超过我可以吞咽。感谢所有写过这个问题的人。
    猜你喜欢
    • 1970-01-01
    • 2016-05-29
    • 2021-09-19
    • 2015-05-10
    • 2018-12-05
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    相关资源
    最近更新 更多