c# IO操作(带进度的文件复制器,读取文本文件的指定行)

带进度的文件复制器

     基本原理就是通过Stream的BeginRead来异步复制文件,同时刷新进度条的状态

代码

读取文件的指定行

1、通过StreamReader的Readline

通过StreamReader 读取

StreamReader sr = new StreamReader("E:\\abc.txt");
Console.WriteLine("Peek读取");
var i = 0;
while (sr.Peek() >= 0)
{
 if (++i == 50000000-1)
{
 Console.WriteLine(sr.ReadLine());
 break;
}
 continue;
}
sr.Close();

2、通过 FileStream.seek()来读取

Seek()方法的定义如下

public override long Seek (
long offset,
SeekOrigin origin
)

只要知道offset就可以了!

于是我们可以定义一个类,将每行开始的offset找出来,有了每行开始的offset,读取就自然不成问题了

Code

 public class ReadByLine
    {
        public ReadByLine(string name)
        {
            PositionMap=new List<long>();
            FileName = name;
            Done = false;
        }
        public bool Done
        {
            get;
            set;
        }

        /**//// <summary>
        /// 当前流位置
        /// </summary>
        public long Position { get; set; }

        /**//// <summary>
        /// 文件的行数
        /// </summary>
        public long Lines { get; set; }

        /**//// <summary>
        /// 文件名(包含路径)
        /// </summary>
        public string FileName { get; set; }

        /**//// <summary>
        ///  行位置列表
        /// </summary>
        public List<long> PositionMap { get; set; }

        private StreamReader sr;
        private FileStream fs;

        /**//// <summary>
        /// 打开文件
        /// </summary>
        /// <returns></returns>
        public bool Open()
        {
            try
            {
                //初始化各流
                sr = new StreamReader(FileName);
                InitMap();
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }

        private void InitMap()
        {
      
            Lines = 1;
            Position = 0;
            //在地图中加入首条数据的位置信息
            PositionMap.Add(Position);

            //顺序建立文件地图
            while (sr.Peek()>0)
            {
                var str = sr.ReadLine();
                Position +=Encoding.UTF8.GetBytes(str).Length+ 2;
                PositionMap.Add(Position);
                Lines++;
            }
            Done = true;
            sr.Close();
        }

        public string ReadLine(int line)
        {
            bool flag = true;
            var str="";
            while (flag)
            {
                if (!Done) continue;
                fs = new FileStream(FileName, FileMode.Open);
                fs.Seek(PositionMap[line], SeekOrigin.Begin);
                var reader = new StreamReader(fs);
                str = reader.ReadLine();
                reader.Close();
                fs.Close();
                flag = false;
            }
            return str;
        }

        public bool Close()
        {
            try
            {
                //fs.Close();
                sr.Close();
                return true;
            }
            catch
            {
                return false;
            }
        }
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GIS讲堂

数据库 连接(JOIN)

连接运算中有两种最为重要的连接,一种是等值连接(Equijoin),另一种是自然连接(Nature Join):等值连接是从关系R和S中的笛卡尔积中选取A,B属...

1653
来自专栏JAVA高级架构

面试中单例模式有几种写法

“你知道茴香豆的‘茴’字有几种写法吗?” 纠结单例模式有几种写法有用吗?有点用,面试中经常选择其中一种或几种写法作为话头,考查设计模式和coding style...

2816
来自专栏lgp20151222

kibana使用

能不用空格表示OR或者AND就不用空格表示,因为要么全用要么全部不用,否则会因为解析搜索同级的时候,若出现空格和OR,会冲突覆盖意义,虽不会报错,但是,得不到自...

2231
来自专栏Java成神之路

Mybatis_总结_03_用_动态SQL

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要...

1082
来自专栏web编程技术分享

【Java框架型项目从入门到装逼】第十五节 - jdbc模糊查询实现(附带详细调试过程)

3696
来自专栏王小雷

SAS学习笔记之《SAS编程与数据挖掘商业案例》(5)SAS宏语言、SQL过程

SAS学习笔记之《SAS编程与数据挖掘商业案例》(5)SAS宏语言、SQL过程 1. 一个SAS程序可能包含一个或几个语言成分: DATA步或PROC步 全程语...

3088
来自专栏向治洪

单例模式

单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。 这样的模式有几个好处: 1、某些...

1827
来自专栏ml

南阳OJ----Binary String Matching

Binary String Matching 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述Given two strings A...

30010
来自专栏爱撒谎的男孩

Mybatis之ResultMap

4104
来自专栏IT可乐

Java设计模式之(一)------单例模式

1、什么是单例模式?   采取一定的办法保证在整个软件系统中,单例模式确保对于某个类只能存在一个实例。有如下三个特点:   ①、单例类只能有一个实例   ②、单...

2087

扫码关注云+社区