我有一个简单的函数,它应该接收 Stream 对象并将其写入文件“result.txt”这是我的函数:
public void WriteToFile(Stream stream)
{
StreamReader reader = new StreamReader(stream);
stream.Position = 0;
FileInfo f = new FileInfo("result.txt");
FileStream fs = f.Create();
stream.CopyTo(fs);
stream.Position = 0;
var text = reader.ReadToEnd();
Console.WriteLine(text);
}
Run Code Online (Sandbox Code Playgroud)
但我在写入文件时遇到问题。结果 - 文件为空。但是,我在控制台中收到这行代码的输出:
var text = reader.ReadToEnd();
Console.WriteLine(text);
Run Code Online (Sandbox Code Playgroud)
在控制台中我得到简单而简短的 json 输出
{"startAt":0,"maxResults":0,"total":472,"issues":[]}
Run Code Online (Sandbox Code Playgroud)
此函数可以与其他较大的流配合使用,但这个 52 字节流只是不想写入文件。我究竟做错了什么?
我有以下方法:
[SuppressMessage("Reliability", "CA2000:Dispose objects before losing scope", Justification = "If we dispose of the csvWriter, it won't be available to write.")]
public static MemoryStream CreateCsvStream(IEnumerable<object> records)
{
MemoryStream memoryStream = new();
StreamWriter streamWriter = new(memoryStream);
CsvWriter csvWriter = new(streamWriter, CultureInfo.InvariantCulture);
csvWriter.Context.TypeConverterCache.AddConverter<bool>(new CollendaBooleanConverter());
csvWriter.Context.TypeConverterCache.AddConverter<bool?>(new CollendaBooleanConverter());
csvWriter.Context.TypeConverterCache.AddConverter<DateOnly>(new CollendaDateOnlyConverter());
csvWriter.Context.TypeConverterCache.AddConverter<DateOnly?>(new CollendaDateOnlyConverter());
csvWriter.Context.TypeConverterCache.AddConverter<decimal>(new CollendaDecimalConverter());
csvWriter.Context.TypeConverterCache.AddConverter<decimal?>(new CollendaDecimalConverter());
csvWriter.WriteRecords(records);
streamWriter.Flush();
return memoryStream;
}
Run Code Online (Sandbox Code Playgroud)
这是可行的,但正如 中所暗示的SuppressMessage,如果我使用usingso MemoryStream、StreamWriter和/或CsvWriter,当我稍后执行以下代码时,它们将被释放:
private void Upload(MemoryStream memoryStream)
{
_sftpClient.Connect();
_ = memoryStream.Seek(0, SeekOrigin.Begin);
string …Run Code Online (Sandbox Code Playgroud) 我正在访问一个httpwebrequest,它返回一个pdf文件作为响应.我正在将该响应读入内存流,然后转换为文件.问题是,是否正在创建数百个文件.不知道为什么,我尝试了很多方法,并且都做了同样的事情......这是第一个返回内存流的方法.
MemoryStream memStream = new MemoryStream();
byte[] buffer = new byte[2048];
int bytesRead = 0;
do
{
bytesRead = _ResponseStream.Read(buffer, 0, buffer.Length);
memStream.Write(buffer, 0, bytesRead);
} while (bytesRead != 0);
Run Code Online (Sandbox Code Playgroud)
第二个转换为FileStream ...
byte[] data = stream.ToArray();
FileStream fs = new FileStream(newFile, FileMode.CreateNew);
fs.Write(data, 0, data.Length);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑添加更多代码......
public MemoryStream GetToStream()
{
if (_Req == null)
throw new Exception("HttpWebRequest is not initialised");
GetResult(_Req);
MemoryStream memStream = new MemoryStream();
byte[] buffer = new byte[2048];
int bytesRead = 0;
do
{
bytesRead = …Run Code Online (Sandbox Code Playgroud) 我已经加载了一个带有word文档的内存流,我希望能够更改内存流中的特定文本并将其保存回word文档,如搜索和替换功能.请允许任何人帮助我,因为我不想使用Word Interop库.我已经有了加载和保存文档的代码,请参阅下文.问题是,如果我将memorystring转换为字符串并使用字符串替换方法,当我保存字符串时,word文档中的所有格式都将丢失,当我打开文档时,所有显示的都是整个地方的黑盒子.
private void ReplaceInFile(string filePath, string searchText, string replaceText)
{
byte[] inputFile = File.ReadAllBytes(filePath);
MemoryStream memory = new MemoryStream(inputFile);
byte[] data = memory.ToArray();
string pathStr = Request.PhysicalApplicationPath + "\\Docs\\OutputDocument.doc";
FileInfo wordFile = new FileInfo(pathStr);
FileStream fileStream = wordFile.Open(FileMode.Create, FileAccess.Write, FileShare.None);
fileStream.Write(data, 0, data.Length);
fileStream.Close();
memory.Close();
}
Run Code Online (Sandbox Code Playgroud)
我从互联网上的示例代码中复制了代码.所以这就是为什么使用memorystream,因为我不知道该怎么做.我的问题是我工作的公司不想使用单词interop,因为有时他们发现单词可以在occassion上显示弹出对话框,阻止编码功能执行.这就是为什么我想以一种程序化的方式来研究实现邮件合并功能的方法.很多年前,我确实做了类似于我想要做的事情,但是在Delphi而不是C#中,我通常会丢失代码.所以,如果有人能够对此有所了解,那么我将不胜感激.
我无法从MemoryStream反序列化我的XML文件.我有一个生成的MyXmlFile类和一个包含XML文件的MemoryStream,我想将其反序列化为MyXmlFile类型的对象.
public static class XmlSerializeObject
{
public static T FromStream<T>(Stream s)
{
var serializer = new XmlSerializer(typeof(T));
return (T) serializer.Deserialize(s);
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个包含xml文件的MemoryStream ms.如果我尝试将该流反序列化为MyXmlFile类型的对象,我会得到一个异常"XML文档中存在错误(0,0)"
MyXmlFile test = XmlSerializeObject.FromStream<MyXmlFile>(ms);
Run Code Online (Sandbox Code Playgroud)
但是我确认我的MemoryStream是正确的.如果我首先将我的流写入光盘上的文件而不是再次读取该文件,它可以正常工作.
FileStream outStream = File.OpenWrite("D:\\p.xml");
outStream.Write(((MemoryStream)ms).ToArray(), 0, ((MemoryStream)ms).ToArray().Length);
outStream.Flush();
outStream.Close();
MyXmlFile test= XmlSerializeObject.FromStream<MyXmlFile>(File.OpenRead("D:\\p.xml"));
Run Code Online (Sandbox Code Playgroud)
我自己无法找到解决方案,这就是为什么我决定发布我的问题.也许有人之前有同样的问题,并能够帮助我.
提前致谢.如果有什么不清楚请问.
我有5个MemoryStreams.我想创建一个新的zip(也将是一个Stream),而我拥有的5个MemoryStream中的每一个都会重新发送一个文件.
我确实有关于如何Zip一个字符串/ 1 MemoryStream的代码.
public static string Zip(string value)
{
//Transform string into byte[]
byte[] byteArray = new byte[value.Length];
int indexBA = 0;
foreach (char item in value.ToCharArray())
{
byteArray[indexBA++] = (byte)item;
}
//Prepare for compress
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.IO.Compression.GZipStream sw = new System.IO.Compression.GZipStream(ms,
System.IO.Compression.CompressionMode.Compress);
//Compress
sw.Write(byteArray, 0, byteArray.Length);
//Close, DO NOT FLUSH cause bytes will go missing...
sw.Close();
//Transform byte[] zip data to string
byteArray = ms.ToArray();
System.Text.StringBuilder sB = new System.Text.StringBuilder(byteArray.Length);
foreach (byte item in byteArray) …Run Code Online (Sandbox Code Playgroud) 我想在内存流中保存一个笔画用于此目的是使用BinaryFormatter但是当我尝试序列化Stroke时我得到一个错误,我无法序列化笔画
有没有办法在笔记本中保存笔画或序列化笔画?
这是我的代码的一部分
int size = inkCanvas1.Strokes.Count();
IFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
if (size != 0)
{
try
{
formatter.Serialize(stream, inkCanvas1.Strokes[size - 1]);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
我肯定错过了一些非常明显的东西,但任何人都可以解释为什么在第二种情况下有更好的压缩率?!
案例1:压缩率非常低,有时甚至会增加尺寸.
using (var memoryStream = new System.IO.MemoryStream())
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress))
{
new BinaryFormatter().Serialize(gZipStream, obj);
gZipStream.Close();
return memoryStream.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
案例2:更好的压缩,我没有得到规模增长.
using (MemoryStream msCompressed = new MemoryStream())
using (GZipStream gZipStream = new GZipStream(msCompressed, CompressionMode.Compress))
using (MemoryStream msDecompressed = new MemoryStream())
{
new BinaryFormatter().Serialize(msDecompressed, obj);
byte[] byteArray = msDecompressed.ToArray();
gZipStream.Write(byteArray, 0, byteArray.Length);
gZipStream.Close();
return msCompressed.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
我已经完成了镜像解压缩,在这两种情况下我都可以将它反序列化为源对象而不会出现任何问题.
以下是一些统计数据:
UncSize:58062085B,Comp1:46828139B,0.81%
UncSize:58062085B,Comp2:31326029B,0.54%
UncSize:7624735B,Comp1:7743947B,1.02%
UncSize:7624735B,Comp2:5337522B,0.70%
UncSize:1237628B,Comp1:1265406B,1.02%
UncSize:1237628B,Comp2:921695B,0.74%
我有一种压缩字节数组的方法.我使用了一个内存流和一个文件流进行测试.来自内存流的结果更大,即使它的方法相同,任何人都可以解释原因吗?
public byte[] DeflateCompress(byte[] data2Compress)
{
using (FileStream _fileToCompress = File.Create("_deflatecompressed.bin"))
{
using (DeflateStream _compressionStream = new DeflateStream(_fileToCompress, CompressionMode.Compress))
{
_compressionStream.Write(data2Compress, 0, data2Compress.Length);
_compressionStream.Close();
}
}
return File.ReadAllBytes("_deflatecompressed.bin");
}
public byte[] DeflateCompress(byte[] data2Compress)
{
using (MemoryStream _memStreamCompress = new MemoryStream())
{
using (DeflateStream _defalteStreamCompress = new DeflateStream(_memStreamCompress, CompressionMode.Compress))
{
_defalteStreamCompress.Write(data2Compress, 0, data2Compress.Length);
_defalteStreamCompress.Close();
}
return _memStreamCompress.GetBuffer();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将输出字节数组写入文件,则使用memorystream创建的字节数更大.
如何将BitmapSource转换为MemoryStream.虽然我尝试了一些代码:
private Stream StreamFromBitmapSource(BitmapSource writeBmp)
{
Stream bmp;
using (bmp = new MemoryStream())
{
BitmapEncoder enc = new BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(writeBmp));
enc.Save(bmp);
}
return bmp;
}
Run Code Online (Sandbox Code Playgroud)
它没有给出任何错误但是在调试点之后它显示了一些下面列出的异常.
容量:'printStream.Capacity'引发类型'System.ObjectDisposedException'的异常长度:'printStream.Length'抛出类型'System.ObjectDisposedException'的异常位置:'printStream.Position'抛出类型'System.ObjectDisposedException的异常"
memorystream ×10
c# ×9
compression ×2
filestream ×2
gzipstream ×2
.net ×1
bitmapsource ×1
c#-4.0 ×1
csvhelper ×1
deflate ×1
file ×1
file-io ×1
replace ×1
search ×1
streamwriter ×1
using ×1
wpf ×1