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]));
我正在尝试从特定位置读取所有文件(只需要 xml 类型)。我的目标是将它们存储到 Dictionary
这是正确的做法吗?以及如何在将 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]));