吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 983|回复: 24
收起左侧

[求助] C# 是否支持只从一个txt的多少字节后开始读,并且仅向后读多少个字节 ? 文件巨大

[复制链接]
getstr88 发表于 2022-6-19 23:29
C# 是否支持只从一个txt的多少字节后开始读,并且仅向后读多少个字节 ? 文件巨大,单个6GB左右,如果正常File.ReadAllText,内存要爆炸了。但因为文件按自己设定格式写入的。每次要读的时候,知道应该从第几个字节读,读多少个长度

所以问此问题。请各位大佬看看这个问题有解么?但不用提供其他方案,比如写数据库之类的。甲方老项目要求,不支持修改原本方案

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
为之奈何? + 1 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

hackgsl 发表于 2022-6-19 23:37
可以逐行读取,
[C#] 纯文本查看 复制代码
StreamReader sr = new StreamReader(path, Encoding.Default);
string line;
while ((line = sr.ReadLine()) != null)
{
	//逐行读取
}
sr.Close();
TakeKeyEasy 发表于 2022-6-20 00:16
可以考虑截取相应的长度存入数据库,然后读取出来后处理呢
ReLoading 发表于 2022-6-20 00:40
控制一下 开始位置和读取长度不就解决了


[C#] 纯文本查看 复制代码
using System.IO;
class Program
{
    //循环读取大文本文件
    static void Main(string[] args)
    {
      FileStream fsRead;     
      string filePath="C:\\Users\\filedemo.txt"; //获取文件路径      
      try
      {
        fsRead = new FileStream(@filePath,FileMode.Open);//用FileStream文件流打开文件
      }
      catch (Exception)
      {
        throw;
      }
      long leftLength = fsRead.Length;//还没有读取的文件内容长度
      byte[] buffer = new byte[1024]; //创建接收文件内容的字节数组
	  int maxLength=buffer.Length;//每次读取的最大字节数
      int num=0;//每次实际返回的字节数长度      
      int fileStart=0;//文件开始读取的位置
      while (leftLength>0)
      {       
        fsRead.Position=fileStart;//设置文件流的读取位置
        if (leftLength<maxLength)
        {
          num=fsRead.Read(buffer,0,Convert.ToInt32(leftLength));
        }
        else{
          num=fsRead.Read(buffer,0,maxLength);
        }
        if (num==0)
        {
          break;
        }
        fileStart += num;
        leftLength -= num;
        Console.WriteLine(Encoding.Default.GetString(buffer));
      }
      Console.WriteLine("end of line");
      fsRead.Close();
      Console.ReadKey();
    }
}
4028574 发表于 2022-6-20 08:21
[C#] 纯文本查看 复制代码
            using FileStream fs = File.OpenRead(@"e:\desktop\5.md");
            fs.Seek(100, SeekOrigin.Begin); //设置要开始读取的位置,文件开头100个字节以后的地方开始
            byte[] buffer = new byte[1024];
            int recvSize = fs.Read(buffer, 0, 1024);
            Console.WriteLine(Encoding.Default.GetString(buffer));
 楼主| getstr88 发表于 2022-6-20 08:37
hackgsl 发表于 2022-6-19 23:37
可以逐行读取,
[mw_shl_code=csharp,true]StreamReader sr = new StreamReader(path, Encoding.Default); ...

不行,读到指定行,就走几百万行,纯属浪费资源。况且,根本不是按行分隔。而是128KB对应1个自定义数据
 楼主| getstr88 发表于 2022-6-20 08:38
TakeKeyEasy 发表于 2022-6-20 00:16
可以考虑截取相应的长度存入数据库,然后读取出来后处理呢

请看题目,说了不能数据库
 楼主| getstr88 发表于 2022-6-20 08:40
感谢4楼和5楼。但问下,这样一开始File.read,不会把文件都读取是么
murder2008 发表于 2022-6-20 08:40
4#给出了方案,以二进制方式读取,打开文件后指定要偏移的位置
 楼主| getstr88 发表于 2022-6-20 08:53
murder2008 发表于 2022-6-20 08:40
4#给出了方案,以二进制方式读取,打开文件后指定要偏移的位置

文本怎么处理? 一开始以为客户那边说每个数据128KB是定死的

结果刚才又说不行,因为是文本信息(且没有换行,而是用自定义的|作为数据分隔符)

那这样的话,没法准确知道是哪个位置

只能粗略取出那个位置,但是如何将那个位置的二进制变成文字(UTF-8)呢?关键是找到的那个位置,不一定是一个字符的开始,一个字符UTF-8是1--3字节,不一定一开始定位到哪个字节了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-28 06:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表