MemoryStream输出到文件c#
MemoryStream output to a file c#
我有以下代码:
string fileName = GetFileName();
using (var stream = new MemoryStream())
{
using (var sw = new StreamWriter(stream))
{
for (int i = 0; i < 20; i++)
{
sw.WriteLine(String.Format("{0};{1};{2};{3};{4};{5}", i.ToString(), (i*2).ToString(), "-_-_-", "-_" + i.ToString() + "_-", "3", "15"));
}
// Check if compression needed.
if (stream.Length > limit)
{
sw.Flush();
stream.Position = 0;
using (Ionic.Zip.ZipFile zipFile = new Ionic.Zip.ZipFile())
{
absoluteFileName = Path.GetFileName(fileName);
zipFile.AddEntry(absoluteFileName, stream);
zipFileName = Path.Combine(Path.GetDirectoryName(fileName), Path.ChangeExtension(absoluteFileName, ZipExtension));
zipFile.Save(zipFileName);
}
}
else
{
// no compression needed
using (FileStream file = new FileStream(fileName, FileMode.Create, System.IO.FileAccess.Write))
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, (int)stream.Length);
file.Write(bytes, 0, bytes.Length);
//stream.Close();
}
}
}
我正在尝试生成一个纯文本文件,以防内存流长度(以字节为单位)不大于具体的字节数(限制(见条件)。
如果内存流长度大于具体的字节数,那么我会创建一个压缩文件。
当我在不需要压缩(stream.Length <= 限制)的情况下尝试将内存流的所有内容写入纯文本文件时,我的问题出在 else 主体中。我得到一个 39 字节的文件,但是当我打开它时,它是空的,里面只有新行。
我这样做是因为我不想直接在磁盘上创建文件以防我需要压缩它。所以如果最后不需要压缩,我将所有的流内存写入一个文件,这就是问题所在,文件是空的,只有换行符。
我做错了什么?
更新2
我在条件之前放了下面一行:
sw.Flush();
stream.Position = 0;
现在内容已写入文件。
My problem is in the else body
好吧,您在第一个 if
正文中的处理方式不同。
在第一个 if
正文中,您明确刷新了编写器并倒回了流:
sw.Flush();
stream.Position = 0;
您没有在 else
正文中执行任何一项操作,因此您不会获得任何已写入流的数据(无倒带),并且可能仍有数据缓冲在StreamWriter
(不冲洗)。这是 一个 问题。
接下来,您要检查 "limit" 而不刷新 StreamWriter
,这意味着可能会有更多数据,这意味着您 应该 压缩,但你不是。所以我建议你在你的 if
语句发生之前调用 sw.Flush()
。
最后,我强烈建议不要无缘无故地创建另一个字节数组 - 最后 using
语句的主体可以是:
stream.CopyTo(file);
我有以下代码:
string fileName = GetFileName();
using (var stream = new MemoryStream())
{
using (var sw = new StreamWriter(stream))
{
for (int i = 0; i < 20; i++)
{
sw.WriteLine(String.Format("{0};{1};{2};{3};{4};{5}", i.ToString(), (i*2).ToString(), "-_-_-", "-_" + i.ToString() + "_-", "3", "15"));
}
// Check if compression needed.
if (stream.Length > limit)
{
sw.Flush();
stream.Position = 0;
using (Ionic.Zip.ZipFile zipFile = new Ionic.Zip.ZipFile())
{
absoluteFileName = Path.GetFileName(fileName);
zipFile.AddEntry(absoluteFileName, stream);
zipFileName = Path.Combine(Path.GetDirectoryName(fileName), Path.ChangeExtension(absoluteFileName, ZipExtension));
zipFile.Save(zipFileName);
}
}
else
{
// no compression needed
using (FileStream file = new FileStream(fileName, FileMode.Create, System.IO.FileAccess.Write))
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, (int)stream.Length);
file.Write(bytes, 0, bytes.Length);
//stream.Close();
}
}
}
我正在尝试生成一个纯文本文件,以防内存流长度(以字节为单位)不大于具体的字节数(限制(见条件)。
如果内存流长度大于具体的字节数,那么我会创建一个压缩文件。
当我在不需要压缩(stream.Length <= 限制)的情况下尝试将内存流的所有内容写入纯文本文件时,我的问题出在 else 主体中。我得到一个 39 字节的文件,但是当我打开它时,它是空的,里面只有新行。
我这样做是因为我不想直接在磁盘上创建文件以防我需要压缩它。所以如果最后不需要压缩,我将所有的流内存写入一个文件,这就是问题所在,文件是空的,只有换行符。
我做错了什么?
更新2 我在条件之前放了下面一行:
sw.Flush();
stream.Position = 0;
现在内容已写入文件。
My problem is in the else body
好吧,您在第一个 if
正文中的处理方式不同。
在第一个 if
正文中,您明确刷新了编写器并倒回了流:
sw.Flush();
stream.Position = 0;
您没有在 else
正文中执行任何一项操作,因此您不会获得任何已写入流的数据(无倒带),并且可能仍有数据缓冲在StreamWriter
(不冲洗)。这是 一个 问题。
接下来,您要检查 "limit" 而不刷新 StreamWriter
,这意味着可能会有更多数据,这意味着您 应该 压缩,但你不是。所以我建议你在你的 if
语句发生之前调用 sw.Flush()
。
最后,我强烈建议不要无缘无故地创建另一个字节数组 - 最后 using
语句的主体可以是:
stream.CopyTo(file);