c# - 将流写入文件和内存
问题描述
我正在尝试读取 EmbeddedResource (默认配置文件)并将其写入文件。在那之后,我应该阅读文件并让事情变得更容易,我决定一步完成。
private string CreateDefaultFile()
{
using (var stream = Shelter.Assembly.GetManifestResourceStream($@"Mod.Resources.Config.{_file}"))
{
if (stream == null)
throw new NullReferenceException(); //TODO
using (var ms = new MemoryStream())
{
using (var fs = new FileStream(Shelter.ModDirectory + _file, FileMode.Create, FileAccess.Write, FileShare.Read))
{
byte[] buffer = new byte[512];
int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, bytesRead);
fs.Write(buffer, 0, bytesRead);
}
fs.Flush();
ms.Flush();
return Encoding.UTF8.GetString(ms.ToArray());
}
}
}
}
这确实会创建文件,但返回值似乎无法正常工作。内容似乎正确,但 JSON.Net 无法解析它并出现此错误:
JsonReaderException: Unexpected character encountered while parsing value: . Path '', line 0, position 0.
. 使用File.ReadAllText(...)
而不是Encoding.UTF8.GetString(ms.ToArray())
似乎有效,所以我猜这是我如何将流加载到字符串中的问题。
此外,由于文件很小,因此不需要分块部分,我已经在多个更好用的地方阅读过,所以我更喜欢它。
(目标.NET Framework 3.5
)
解决方案
感谢dbc评论和Tergiver 的回答,我解决了这个问题。
编码:
private string CreateDefaultFile()
{
using (var stream = Shelter.Assembly.GetManifestResourceStream($@"Mod.Resources.Config.{_file}"))
{
if (stream == null)
throw new NullReferenceException(); //TODO
using (var ms = new MemoryStream())
{
using (var fs = File.Open(Shelter.ModDirectory + _file, FileMode.Create, FileAccess.Write, FileShare.Read))
{
byte[] buffer = new byte[512];
int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, bytesRead);
fs.Write(buffer, 0, bytesRead);
}
fs.Flush();
ms.Flush();
byte[] content = ms.ToArray();
if (content.Length >= 3 && content[0] == 0xEF && content[1] == 0xBB && content[2] == 0xBF)
return Encoding.UTF8.GetString(content, 3, content.Length - 3);
return Encoding.UTF8.GetString(content);
}
}
}
}
推荐阅读
- ssh - Cygwin 自行消失并弄乱了我的下载文件夹权限(我认为)
- ios - 我们可以从firebase获取pdf或excel的记录吗
- python - pip 如何在不同的环境中管理相同的包以提高空间效率
- python - 从源到目的地的矩阵中的广度优先搜索
- javascript - 如何为未定义的窗口对象编写测试用例 | Vue 测试工具 | 笑话框架
- git - 自动计算整个 git 分支上的修改(例如添加/删除的字母)
- html - 如何使img大小受单元格大小限制
- laravel - 如果条件在控制器中不起作用,则在 laravel 中
- javascript - 有没有办法检测从 angular8 中的对象数组动态绑定的 formArray 的 valueChanges
- azure - 在 YAML 配置中排除项目 azure-pipelines