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;
}
}
}
- 正确姿势:如何调戏蹭网者
- 当我们讨论流畅度的时候,我们究竟在说什么?
- ImageButton和ZoomButton使用大全
- Android 插件化突破应用市场无法上广告的问题
- ImageView的属性和方法大全
- sharedpreferences如何保存对象
- Android:全面解析熟悉而陌生 的 Application 类使用
- ToggleButton和Switch使用大全
- Android 无需权限显示悬浮窗, 兼谈逆向分析 App
- android数据保存之greendao
- CheckBox和RadioButton使用大全
- 关于 Android 实现滑动返回的几种方法总结
- android 面试之listview
- 放yy直播点赞动画
- 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 数组属性和方法
- 基于飞桨复现 CVPR2018 Relation Net的全程解析
- 如何将DB2数据库转换成Oracle数据库,这一篇告诉你
- MySQL 8.0 安装部署3个注意事项
- 打卡群刷题总结0802——反转链表 II
- 打卡群刷题总结0801——解码方法
- 动手写简单的嵌入式操作系统二
- C++核心准则E.6:使用RAII防止资源泄露
- C++核心准则E.12: 当不可能或不愿意通过抛出异常退出函数时使用noexcept
- C++核心准则E.13: 直接拥有一个对象所有权时永远不要抛出异常
- C++核心准则E.14:使用根据目的设计的用户定制类型异常(非内置类型)
- C++核心准则E.16:析构函数,内存释放和swap操作永远不能失败
- Eclipse配合GDB和jlinkGDBServer仿真调试STM32
- 单片机程序构架
- 打卡群刷题总结0730——格雷编码
- 常用的vim配置,_vimrc文件