首页 > 解决方案 > 将流写入文件和内存

问题描述

我正在尝试读取 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

标签: c#streamjson.net

解决方案


感谢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);
            }
        }
    }
}

推荐阅读