Read a stream in reverse(反向读取流)
本文介绍了反向读取流的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
有没有方法可以倒着读取流?流是可查找的。
推荐答案
您可以通过执行以下操作来反转流:
var reversedStream = new ReverseStream(stream);
要反转文件:
using (var inputFile = File.OpenRead("file.dat"))
using (var inputFileReversed = new ReverseStream(inputFile))
using (var outputFile = File.Open("file.dat.reversed", FileMode.Create, FileAccess.Write))
{
inputFileReversed.CopyTo(outputFile);
}
哪个使用ReverseStream
类:
public class ReverseStream : Stream
{
readonly Stream stream;
public ReverseStream(Stream stream)
{
if (!stream.CanSeek) throw new Exception("Stream cannot seek");
stream.Seek(stream.Position, SeekOrigin.End);
this.stream = stream;
}
public override bool CanRead => true;
public override bool CanSeek => true;
public override bool CanWrite => false;
public override long Length => stream.Length;
public override long Position
{
get
{
var position = stream.Length - stream.Position;
return position;
}
set
{
stream.Position = stream.Length - value;
}
}
public override int Read(byte[] buffer, int offset, int count)
{
if (stream.Position == 0) return 0;
var startReadFrom = stream.Position - count;
if (startReadFrom < 0)
{
count += (int)startReadFrom;
startReadFrom = 0;
}
stream.Seek(startReadFrom, SeekOrigin.Begin);
var bytesRead = stream.Read(buffer, offset, count);
stream.Seek(startReadFrom, SeekOrigin.Begin);
Array.Reverse(buffer, offset, bytesRead);
return bytesRead;
}
public override long Seek(long offset, SeekOrigin origin)
{
switch (origin)
{
case SeekOrigin.Begin:
stream.Seek(offset, SeekOrigin.End);
break;
case SeekOrigin.End:
stream.Seek(offset, SeekOrigin.Begin);
break;
case SeekOrigin.Current:
stream.Seek(-offset, SeekOrigin.Current);
break;
}
return Position;
}
public override void SetLength(long value)
{
}
public override void Write(byte[] buffer, int offset, int count)
{
}
public override void Flush()
{
}
}
这篇关于反向读取流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:反向读取流
基础教程推荐
猜你喜欢
- rabbitmq 的 REST API 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- c# Math.Sqrt 实现 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- 如何激活MC67中的红灯 2022-01-01
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- SSE 浮点算术是否可重现? 2022-01-01
- 将 XML 转换为通用列表 2022-01-01