在c#中修改流

时间:2017-06-16 20:00:10

标签: c# stream memorystream httpserver

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

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

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

我知道我可以使用不同的库来压缩文件,但如果我坚持使用这个库并学习新东西,那将会很不错。

1 个答案:

答案 0 :(得分:0)

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

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