有一个 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

这么多年代码发展, 竟然发现读到一个文件位置竟不容易相关推荐

  1. 如何读到一个文件的最后更新日期和时间

    type   //分别对应文件创建时间,访问时间,修改时间   TFileTimeType = (fttCreation, fttLastAccess, fttLastWrite);     func ...

  2. 我擦!迅雷的代码结构竟然被扒了精光~

    作者:jiawen 链接:juejin.im/post/6890344584078721031 # 背景 之前扒过飞书的源码,从代码设计架构层面里里外外学习一把,飞书还是挺"大方" ...

  3. 卧槽!迅雷的代码结构竟然被扒了精光!

    背景 之前扒过飞书的源码,从代码设计架构层面里里外外学习一把,飞书还是挺 "大方" 的,源码在客户端和网页端都一览无余,不过好像新版本已经看不到了.相关的文章由于在内网技术论坛发过 ...

  4. 大神尝试扒迅雷的代码,竟然被扒了个精光!

    欢迎大家关注 来源:juejin.im/post/6890344584078721031 文末送书5本 背景 之前扒过飞书的源码,从代码设计架构层面里里外外学习一把,飞书还是挺 "大方&qu ...

  5. MFC打开一个文件方法汇总

    第1个回答 CFileDialog  文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下:  CFileDialog::CFileDialog( BOOL bOpenFileDi ...

  6. 对已有文件进行既读又写的操作时关于文件位置注意事项(适用于Python和C/C++)

    当我们需要对现有文件进行读取数据并修改文件中的数据时,就需要用到对已有文件进行既读又写的操作.有多种可读且可写的文件打开方式:r+,w+,a+,rb+,wb+,ab+,具体含义见下表. 打开 方式 读 ...

  7. 输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据

    C程序,功能如题,代码如下: /* 功能:输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据 基本思路:产生一个长度为n的二维数组,将它作为一个循环队列来看待 */ #include ...

  8. 如果表不存在则创建_当创建一个文件的时候,操作系统发生了什么

    操作文件是我们平时经常有的操作.但是我们可能并不是很了解他们原理,比如为什么删除一个很大的文件,会非常快?创建一个文件的时候,系统发生了什么?为什么删除的文件,还可以恢复?知其然知其所以然.我们一起深 ...

  9. python红楼梦人物词频统计_用Python绘制红楼梦词云图,竟然发现了这个!

    原标题:用Python绘制红楼梦词云图,竟然发现了这个! Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具 ...

最新文章

  1. reactor官方文档译文(2)Reactor-core模块
  2. opengl用什么软件写_汇才论文工具分享:写科研论文的都在用这些截图软件
  3. bbs php redis,LAMP+redis搭建discuz论坛
  4. P4198 楼房重建 线段树 + 区间合并
  5. 疯传短视频小程序V8.3.0源码完整包
  6. Python 下划线
  7. windows传文件到linux服务器--- secureCRT PK xftp
  8. 高管暗示Redmi Note 10系列新品:今日有大事公布?
  9. 大家不要催!雷军的螺丝刀已经准备好了...
  10. C++中this指针的用法
  11. Ubuntu更改国内源,设置固定IP和DNS
  12. oracle java vm,我可以使用Oracle Java 7 HotSpot VM安装DCEVM吗?
  13. 【JVM原理探索,Java组件化架构实践
  14. IOS 多个UIImageView 加载高清大图时内存管理
  15. Excel表格中的删除操作,看看你会几种?
  16. python小学口算题库生成器_使用Python生成Excel版口算题
  17. 图像处理-图像边缘处理
  18. 滴滴裁员 2000 人,具体补偿方案已出
  19. Arduino零基础入门
  20. 【MySQL】—入门介绍

热门文章

  1. Python 实现 PCA
  2. No connection could be made because the target machine actively refused问题原因解决
  3. 人工智能正在跨越“恐怖谷”,未来或将善恶共存
  4. 如何打开服务器的ipv6协议,windows7系统家庭组开启ipv6协议的方法
  5. MCADEx开发 ProE二次开发 Creo二次开发 注册程序
  6. 保研日记--中国人民大学信息学院(人大信院)
  7. 【PythonPlanet】数据清洗原则:完全合一
  8. qiyuan -超级飞侠
  9. 2.19 haas506 2.0开发教程 - bluetooth - 蓝牙通信(仅支持2.2以上版本)
  10. 小程序开发(小程序与普通网页开发的不同)