c# IO操作(带进度的文件复制器,读取文本文件的指定行)
时间:2022-04-22
本文章向大家介绍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;
}
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android ListView列表实现倒计时
- [-Flutter 自组篇-] 蛛网图+绘制+动画实践
- Kotlin类型系统竟如此简单
- 以人为本 | Android 11 的消息通知
- RxJava取消订阅的各种方式的实现
- [- Flutter 基础篇 -] ListView的使用
- Emoji表情在Android JNI中的兼容性问题详解
- 一个吸顶Item的简单实现方法分享
- [- Flutter福利篇 -] Hero转场组件共享 — 附赠-路由动画工具类
- Hue执行多条语句问题
- Android仿抖音列表效果
- com.android.support版本冲突解决方法
- [-Flutter趣玩篇-] 出神入化的Align+动画
- Hive Impala和Hue集成LDAP
- Android仿QQ分组实现二级菜单展示