首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将文件截短到一定的大小,但保留结尾部分?

如何将文件截短到一定的大小,但保留结尾部分?
EN

Stack Overflow用户
提问于 2012-06-17 23:25:02
回答 4查看 4.3K关注 0票数 9

我有一个文本文件,随着时间的推移,我会定期将其截断到某个大小,例如10MB,但保留最后10MB而不是第一个。

有什么聪明的方法可以做到这一点吗?我猜我应该找到正确的点,从那里读取到一个新文件,删除旧文件,并将新文件重命名为旧名称。有更好的想法或示例代码吗?理想情况下,我不会将整个文件读取到内存中,因为文件可能会很大。

请不要建议使用Log4Net等。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-17 23:33:13

如果您只需将最后的10MB读取到内存中,那么这应该是可行的:

代码语言:javascript
运行
复制
using(MemoryStream ms = new MemoryStream(10 * 1024 * 1024)) {
    using(FileStream s = new FileStream("yourFile.txt", FileMode.Open, FileAccess.ReadWrite)) {
        s.Seek(-10 * 1024 * 1024, SeekOrigin.End);
        s.CopyTo(ms);
        s.SetLength(10 * 1024 * 1024);
        s.Position = 0;
        ms.Position = 0; // Begin from the start of the memory stream
        ms.CopyTo(s);
    }
}
票数 4
EN

Stack Overflow用户

发布于 2012-06-17 23:28:18

在写入之前,您不需要读取整个文件,特别是当您正在写入另一个文件时。你可以分块工作;读一点,写一点,多读一点,再写一遍。事实上,这就是所有I/O如何完成的。特别是对于较大的文件,您永远不会真正想要一次读取所有这些文件。

但您提出的是从文件开头删除数据的唯一方法。你必须重写它。Raymond Chen has a blog post on exactly that topic, too.

票数 4
EN

Stack Overflow用户

发布于 2014-06-13 19:45:24

我测试了"false“中的解决方案,但它对我不起作用,它会修剪文件,但会保留文件的开头,而不是结尾。

我怀疑CopyTo复制了整个流,而不是从流位置开始。下面是我是如何工作的:

代码语言:javascript
运行
复制
int trimSize = 10 * 1024 * 1024;
using (MemoryStream ms = new MemoryStream(trimSize))
{
    using (FileStream s = new FileStream(logFilename, FileMode.Open, FileAccess.ReadWrite))
    {
        s.Seek(-trimSize, SeekOrigin.End);

        byte[] bytes = new byte[trimSize];
        s.Read(bytes, 0, trimSize);
        ms.Write(bytes, 0, trimSize);

        ms.Position = 0;
        s.SetLength(trimSize);
        s.Position = 0;
        ms.CopyTo(s);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11072473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档