C# 在c中修改流#

C# 在c中修改流#,c#,stream,memorystream,httpserver,C#,Stream,Memorystream,Httpserver,我有一个简单的方法,人们上传文件,我只是压缩它们并将它们保存到磁盘上。这就是我正在做的,我认为人们会更好地理解代码 /// <summary> /// Client uploads files through here /// </summary> private static void Server_ProcessRequest(HttpListenerContext context) { // I know that context.Request.Input

我有一个简单的方法,人们上传文件,我只是压缩它们并将它们保存到磁盘上。这就是我正在做的,我认为人们会更好地理解代码

/// <summary>
/// Client uploads files through here
/// </summary>
private static void Server_ProcessRequest(HttpListenerContext context)
{
    // I know that context.Request.InputStream starts like: ------WebKitFormBoundaryePkpFF7tjBAqx29L
    // and it also ends with that boundary

    // 1. I read from context.Request.InputStream and skip the headers
    // (I read until I find 4 new lines)

    // 2. I then write the file to disk 
    // var sizeOfFile = context.Request.ContentLength64;
    // etc... read from stream

    // 3. create a new stream in order to compress file later
    var newStream = System.IO.File.Open("FileJustCreated");

    // 4. MySealedLibraryThatICannotModify.CompressFile(newStream,"CompressedFileLocation.zip");        
}
//
///客户端通过此处上传文件
/// 
私有静态void服务器\u ProcessRequest(HttpListenerContext上下文)
{
//我知道context.Request.InputStream的开头类似于:---webkitformboundaryeppkpff7tjbaqx29l
//它也以这个边界结束
//1.我读取context.Request.InputStream并跳过标题
//(我一直读到找到4行新词)
//2.然后我将文件写入磁盘
//var sizeOfFile=context.Request.ContentLength64;
//等…从流中读取
//3.创建一个新流以便以后压缩文件
var newStream=System.IO.File.Open(“FileJustCreated”);
//4.mysealedlibrary,不能修改.CompressFile(newStream,“CompressedFileLocation.zip”);
}

因此,我在这里的问题是如何避免将文件写入磁盘?我无法将
context.Request.InputStream
传递给压缩文件的方法,因为它包含头和其他不属于文件的内容。如果我能创建一个返回新流的方法,那就太好了文件可能很大,我不想在内存中保存所有内容,因此我想创建一个类似
System.IO.File.OpenRead
的方法,其中它返回一个流,其中只有您读取的部分在内存中


我知道我可以使用不同的库来压缩文件,但如果我坚持使用此库并学习一些新的内容,那就太好了。

您可以将以下内容写入内存而不是文件:

using (var buffer = new MemoryStream())
{
    context.Request.InputStream.CopyTo(buffer, sizeOfFile);
    MySealedLibraryThatICannotModify.CompressFile(buffer, path);
}

您可以写入内存而不是文件:

using (var buffer = new MemoryStream())
{
    context.Request.InputStream.CopyTo(buffer, sizeOfFile);
    MySealedLibraryThatICannotModify.CompressFile(buffer, path);
}

这里的典型方法是用另一个(自定义)流包装一个流,该流跟踪消耗的字节数并拒绝发布超过此点的数据。您通常会在包装原始流之前将其消耗到所需的点。我可能可以从古代历史中挖掘出一个实现,如果它能帮助。。。(我以前在protobuf net中就是这样做的)呸,进行了一些挖掘,但是:
SubStream.cs
:为什么不能简单地将部分读取的流传递给
压缩文件
?它是否真的在读取之前将流重置为开始?我认为您可以直接跳到您想要开始使用原始流的地方,并将其传入,假设它以合理合理的方式读取。@Servy通常问题不是从正确的点开始的;它停在正确的地方。如果目的是“从我们所在的位置读取到文件的末尾”,那么请确保:不需要额外的内容-只需传递现有流即可along@MarcGravell问题是如何跳过标题,我认为这应该在开头。这个问题给我的印象是,跳过的流的部分都是在开始的时候,而不是在中间或在中间的某个地方给出伪代码(它跳过一些行,然后只将其余的流写入磁盘,然后写入第三方库)。对于OP来说,如果您需要在开始时跳过的不仅仅是数据,那么您能在问题中澄清一下吗?这里的典型方法是将一个流与另一个(自定义)流包装在一起,该流跟踪消耗的字节数,并拒绝发布超过此点的数据。您通常会在包装原始流之前将其消耗到所需的点。我可能可以从古代历史中挖掘出一个实现,如果它能帮助。。。(我以前在protobuf net中就是这样做的)呸,进行了一些挖掘,但是:
SubStream.cs
:为什么不能简单地将部分读取的流传递给
压缩文件
?它是否真的在读取之前将流重置为开始?我认为您可以直接跳到您想要开始使用原始流的地方,并将其传入,假设它以合理合理的方式读取。@Servy通常问题不是从正确的点开始的;它停在正确的地方。如果目的是“从我们所在的位置读取到文件的末尾”,那么请确保:不需要额外的内容-只需传递现有流即可along@MarcGravell问题是如何跳过标题,我认为这应该在开头。这个问题给我的印象是,跳过的流的部分都是在开始的时候,而不是在中间或在中间的某个地方给出伪代码(它跳过一些行,然后只将其余的流写入磁盘,然后写入第三方库)。对于OP,如果您需要在开始时跳过的不仅仅是数据,您能否在问题中澄清一下?“文件可能很大,我不想在内存中保存所有内容”“文件可能很大,我不想在内存中保存所有内容”