c# 将文件内容存储到 MemoryStream 中并读回

c# store files content into MemoryStream and read back

我正在尝试从特定位置读取所有文件(只需要 xml 类型)。我的目标是将它们存储到 Dictionary dict 中。在调用方法 StreamAll() 之后,我想调用所需的文件 StreamReportFiles.dict[10] 以接收 xml 文件的正确版本。

这是正确的做法吗?以及如何在将 StreamReportFiles.dict[10] 转换回字节 [] 的同时将其转换回字符串或 XmlDocument?

class StreamReportFiles
{
public static Dictionary<int, MemoryStream> dict;

    public static void StreamAll()
    {
        DirectoryInfo dir = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"c:\Templates\"));
        FileInfo[] Files = dir.GetFiles("*.xml");
        dict= new Dictionary<int, MemoryStream>();


        if (Files.Length > 0)
        {
            long len;
            MemoryStream ms;

            foreach (FileInfo fileInfo in Files)
            {

                using (FileStream file = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read))
                {
                    ms = new MemoryStream();
                    byte[] bytes = new byte[file.Length];

                    ms.Write(bytes, 0, (int)file.Length);
                    len = file.Length / 1024;

                    RdlcDictStream.Add(Convert.ToInt32(fileInfo.Name.Substring(0, fileInfo.Name.Length - fileInfo.Extension.Length)), ms);
                }
                Console.WriteLine($"File {fileInfo.Name}  {len} kB size added to MemoryStream");
            }
            
        }

    }

}

}

据我了解,您想将具有 xml 字节 [] 格式数据的 MemoryStream 转换回 XML 字符串。

为此你可以使用 System.Text.Encoding.UTF8.GetString(StreamReportFiles.dict[0])

警告:读取未定义总大小的未定义数量的文件可能会导致 OutOfMemoryException。小心这个。

顺便说一句,如果要将数据存储在内存中,最好将其存储在数组中。

public static Dictionary<int, byte[]> Data { get; private set; }

public static void LoadAllTemplates()
{
    Data = new Dictionary<int, byte[]>();
    DirectoryInfo dir = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Templates"));

    foreach (FileInfo fileInfo in dir.GetFiles("*.xml"))
    {
        if (int.TryParse(fileInfo.Name.Remove(fileInfo.Name.Length - fileInfo.Extension.Length), out int key))
        {
            Data[key] = File.ReadAllBytes(fileInfo.FullName);
            Console.WriteLine($"File {fileInfo.Name} {fileInfo.Length / 1024} kB size added to Data");
        }
        else
            Console.WriteLine($"Failed to parse filename {fileInfo.Name}");
    }
}

用法可能是

StreamReportFiles.LoadAllTemplates();
Console.WriteLine(Encoding.UTF8.GetString(StreamReportFiles.Data[10]));