Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将流写入文件和内存_C#_Stream_Json.net - Fatal编程技术网

C# 将流写入文件和内存

C# 将流写入文件和内存,c#,stream,json.net,C#,Stream,Json.net,我试图读取一个EmbeddedResource(默认配置文件)并将其写入一个文件。之后,我应该阅读文件,并使事情更容易,我决定这样做,在一个单一的步骤 private string CreateDefaultFile() { using (var stream = Shelter.Assembly.GetManifestResourceStream($@"Mod.Resources.Config.{_file}")) { i

我试图读取一个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:分析值时遇到意外字符:。路径“”,第0行,位置0。
。使用
File.ReadAllText(…)
而不是
Encoding.UTF8.GetString(ms.ToArray())
似乎有效,所以我猜这是如何将流加载到字符串中的问题

此外,分块部分是不需要的,因为文件的大小很小,我在多个地方读过,这是更好的使用,所以我更喜欢它

(目标是
.netframework3.5

感谢评论,我解决了这个问题

守则:

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

因此,如果您使用Debug.WriteLine或类似工具打印返回值,那么内容看起来合理吗?如果JSON位也引起错误,我们可能还应该看到它。如果文件内容很小,您是否可以将其添加到问题中(编辑任何机密)返回值是一个json字符串,并且打印它时显示的内容与
json数据
link@Damien\u相同?您的字节数组必须在开头有一个。要正确处理它,请使用
StreamReader
,如和所示。