这么多年代码发展, 竟然发现读到一个文件位置竟不容易
有一个 1G 大的 文本 行文件, 首先我要计出特定行在文件中位置,保存到一个偏移量表文件, 便于后面任意时候打开时可定位取文件块;
以为是一个发展了 30多年的代码早就解决的基本问题(当年在文件流上做过各种定位、分块读),看看老外(很多是10年前写的)这么多的讨论,要解决这个问题, 到现在竟然没有发展出一个基本应用的类来解决 :
https://www.daniweb.com/programming/software-development/threads/35078/streamreader-and-position
http://stackoverflow.com/questions/5404267/streamreader-and-seeking
在 StreamReader.ReadLine 下 StreamReader.Position 和 FileStream.Position 都是读入 1024 大小的 byte, 读入指针如下变化
也就是说, 你根本不可能通过 当前文件位置 FileStream.Position 获得真正的当前文件位置指针, 而且没有任何成熟办法支持你获得这个位置
以上打印结果由如下代码实现:
strLine = sr.ReadLine ();
Debug.Log ("offset = " + sr.BaseStream.Position + " | " + strLine + " | " + strLine.Length);
在网上也看到同样问题 :
使用stream.Seek可以正确定位读取文件某位置上的数据吗..._CSDN论坛 最后也没有答案, 不知道这位兄弟是怎么解决的。
先解决第一问题, 如何可以在文件里定位:
FileStream 打开文件, 通过 Seek 定位后, 要在 StreamRead 里起到定位作用
在看了一堆文档和做了一堆试验, 确认在流里 seek 有效方法 :
无论你是
FileStream.Seek( 10, SeekOrigin.Begin);
还是
StreamReader.BaseStream.Seek (4, SeekOrigin.Begin);
都要重新获取一个流, 才能得到当前文件的正确位置:
sr = new StreamReader (aFile);
也就是说 seek 实质上发生在 FileStream 中, 要用一个新的 Stream 来重新对应, 进行存取;
第二个问题, 如何在读入字串后, 可以得到读出后的真正文件指针位置
如果你用 StreamReader.ReadLine, 如今看是没有 基础方法 的得到真实位置
我的是文本文件,我采用的方法是逐行累加一下, 自己记录一个长度, 第一次没记入回车, 位置得到的不对,
回车的处理处理有一个问题,就是系统是如何处理的, 在老外的文章里有一个办法
如果你是用 ReadLine , 想得到读出长度要加回车长度, 而回车的长度是不定的,
这里 c# - StreamReader and seeking - Stack Overflow 最后一个回答里,给出一个得到回车长度的方法:
intnewLineBytes =System.Environment.NewLine.Length;
经试验不一定对, 我的回车 “x0A" 而这个返回是2个字节;
暂时我只好是 readline + 1 来得到我自己文件的长度了。
看样子, 还是用 readbyte 来自己写是最终方法
重新设计代码方案:
关于FileStream读取大文件问题 - YoMe - 博客园
我自己写的记录偏移量的代码如下, 个人可根据不同文件格式来改变位置标志:
// voidoyRecordOffset(){using (FileStream fsRead = new FileStream(xPath + "/1014test1.txt",FileMode.Open)) { //oyOffset.txt 1014test1.txtbyte[] arr = new byte[2000];//记录到底读取了多少字节的数据int count = 0;bool beol = false;long lOffset = 0;int iLines = 0;while (fsRead.Position <fsRead.Length) {//每一次读取,。返回真正读取到的字节数,用count记录(最后一次读取后可能count可能会小于200)count = fsRead.Read (arr, 0, arr.Length);//Debug.Log ("count ===> " + count);for (int i = 0; i < arr.Length; i++, lOffset++) {if (arr [i] == '\x0a') {//一个行尾beol = true;}else{if (arr [i] == '\x0d') {//一个行尾beol = true;}else{if(beol){//Debug.Log (" * line offset => " + lOffset);iLines++;beol= false;} }}if (iLines >= 8000) {arOffset [iFrames]=lOffset; iFrames++;Debug.Log ("* => iFrames" + iFrames + "|" +lOffset);iLines= 0;}}//if(iFrames > 5)//break;//string s = Encoding.ASCII.GetString(arr);//Debug.Log (" => len "+ s.Length + " | " + s); }Debug.Log ("=> iFrames" +iFrames);}}
另外:对如何正确使用 FileStream.Seek 我进行的测试
FileStream aFile = new FileStream (path + "/oyOffset.txt",FileMode.Open,FileAccess.ReadWrite);
StreamReader sr = new StreamReader (aFile);
....
aFile.Seek( 10, SeekOrigin.Begin);
sr = new StreamReader (aFile); 重新定位后, 要重新打开 stream 才会有效
参考 :关于C#中的StreamReader与FileStream这两个类
转载于:https://www.cnblogs.com/ouyang800/articles/6127819.html
这么多年代码发展, 竟然发现读到一个文件位置竟不容易相关推荐
- 如何读到一个文件的最后更新日期和时间
type //分别对应文件创建时间,访问时间,修改时间 TFileTimeType = (fttCreation, fttLastAccess, fttLastWrite); func ...
- 我擦!迅雷的代码结构竟然被扒了精光~
作者:jiawen 链接:juejin.im/post/6890344584078721031 # 背景 之前扒过飞书的源码,从代码设计架构层面里里外外学习一把,飞书还是挺"大方" ...
- 卧槽!迅雷的代码结构竟然被扒了精光!
背景 之前扒过飞书的源码,从代码设计架构层面里里外外学习一把,飞书还是挺 "大方" 的,源码在客户端和网页端都一览无余,不过好像新版本已经看不到了.相关的文章由于在内网技术论坛发过 ...
- 大神尝试扒迅雷的代码,竟然被扒了个精光!
欢迎大家关注 来源:juejin.im/post/6890344584078721031 文末送书5本 背景 之前扒过飞书的源码,从代码设计架构层面里里外外学习一把,飞书还是挺 "大方&qu ...
- MFC打开一个文件方法汇总
第1个回答 CFileDialog 文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下: CFileDialog::CFileDialog( BOOL bOpenFileDi ...
- 对已有文件进行既读又写的操作时关于文件位置注意事项(适用于Python和C/C++)
当我们需要对现有文件进行读取数据并修改文件中的数据时,就需要用到对已有文件进行既读又写的操作.有多种可读且可写的文件打开方式:r+,w+,a+,rb+,wb+,ab+,具体含义见下表. 打开 方式 读 ...
- 输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据
C程序,功能如题,代码如下: /* 功能:输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据 基本思路:产生一个长度为n的二维数组,将它作为一个循环队列来看待 */ #include ...
- 如果表不存在则创建_当创建一个文件的时候,操作系统发生了什么
操作文件是我们平时经常有的操作.但是我们可能并不是很了解他们原理,比如为什么删除一个很大的文件,会非常快?创建一个文件的时候,系统发生了什么?为什么删除的文件,还可以恢复?知其然知其所以然.我们一起深 ...
- python红楼梦人物词频统计_用Python绘制红楼梦词云图,竟然发现了这个!
原标题:用Python绘制红楼梦词云图,竟然发现了这个! Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具 ...
最新文章
- reactor官方文档译文(2)Reactor-core模块
- opengl用什么软件写_汇才论文工具分享:写科研论文的都在用这些截图软件
- bbs php redis,LAMP+redis搭建discuz论坛
- P4198 楼房重建 线段树 + 区间合并
- 疯传短视频小程序V8.3.0源码完整包
- Python 下划线
- windows传文件到linux服务器--- secureCRT PK xftp
- 高管暗示Redmi Note 10系列新品:今日有大事公布?
- 大家不要催!雷军的螺丝刀已经准备好了...
- C++中this指针的用法
- Ubuntu更改国内源,设置固定IP和DNS
- oracle java vm,我可以使用Oracle Java 7 HotSpot VM安装DCEVM吗?
- 【JVM原理探索,Java组件化架构实践
- IOS 多个UIImageView 加载高清大图时内存管理
- Excel表格中的删除操作,看看你会几种?
- python小学口算题库生成器_使用Python生成Excel版口算题
- 图像处理-图像边缘处理
- 滴滴裁员 2000 人,具体补偿方案已出
- Arduino零基础入门
- 【MySQL】—入门介绍
热门文章
- Python 实现 PCA
- No connection could be made because the target machine actively refused问题原因解决
- 人工智能正在跨越“恐怖谷”,未来或将善恶共存
- 如何打开服务器的ipv6协议,windows7系统家庭组开启ipv6协议的方法
- MCADEx开发 ProE二次开发 Creo二次开发 注册程序
- 保研日记--中国人民大学信息学院(人大信院)
- 【PythonPlanet】数据清洗原则:完全合一
- qiyuan -超级飞侠
- 2.19 haas506 2.0开发教程 - bluetooth - 蓝牙通信(仅支持2.2以上版本)
- 小程序开发(小程序与普通网页开发的不同)