使用下面的代码,我可以下载包含.json文件的.gz文件,但无法将.json文件中的内容提取到内存中。下面的代码导致text
变量为空字符串,当我期望它包含存储在.json文件中的JSON时。
文件结构
example.gz
1a。 example.json
源代码
// Identify the location of the .gz file containing the results of the export
string jobOutputGzipLocation = null;
for (var i = 0; i < 5; i++)
{
var httpResponse2 = await _httpClient.GetAsync($"api/v2/jobs/{jobId}");
if (httpResponse2.IsSuccessStatusCode)
{
var httpMessage2 = await httpResponse2.Content.ReadAsStringAsync();
var httpJsonMessage2 = JObject.Parse(httpMessage2);
if (string.Equals(httpJsonMessage2.Value<string>("status"), "completed", StringComparison.OrdinalIgnoreCase)) {
jobOutputGzipLocation = httpJsonMessage2.Value<string>("location");
break;
}
}
await Task.Delay(3000);
}
if (string.IsNullOrEmpty(jobOutputGzipLocation))
throw new Exception("Unable to identify jobOutputGzipLocation from the job results.");
// Extract the contents of the .gz file into memory
var httpResponse3 = await _httpClient.GetAsync(jobOutputGzipLocation);
if (!httpResponse3.IsSuccessStatusCode) throw new Exception("Shoot3");
var httpMessage3 = await httpResponse3.Content.ReadAsStreamAsync();
using (var ms = new MemoryStream())
{
using (var gZipStream = new GZipStream(httpMessage3, CompressionMode.Decompress))
{
gZipStream.CopyTo(ms);
}
using (var sr = new StreamReader(ms, Encoding.UTF8))
{
var text = sr.ReadToEnd();
}
}
答案 0 :(得分:0)
此代码有效:
using (var ss = new FileStream("log.txt.gz", FileMode.Open))
using (var ms = new MemoryStream())
{
using (var gZipStream = new GZipStream(ss, CompressionMode.Decompress))
{
gZipStream.CopyTo(ms);
}
ms.Seek(0, SeekOrigin.Begin); // so I put the stream to the initial position
using (var sr = new StreamReader(ms, Encoding.UTF8))
{
var text = sr.ReadToEnd();
}
}
根据我的测试,如果不重置名为“ ms”的流的位置,则会将变量“ text”作为空字符串获取。
如果将流放到初始位置,我会得到想要的结果。