文件分割

博客围绕将文件切成小块数据包发送展开,给出初始代码,该代码在第二次读取时报错,提示偏移和长度超出数组界限。随后给出正确代码,通过合理计算分段和块数,使用 FileStream 进行文件读写操作,实现文件切块发送。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我想把一个文件切成一小块一小块的数据包,发出去.
以下是代码:
long  ll_count; 
   byte[]  buff  =new  byte[1000]; 
   long  nread; 
   int  ll_Pos=0; 
 
     ll_count  =  lFilelen  /  1000;                                     
     for  (int  i  =  1;  i  <=  ll_count;  i++) 
     { 
           nread=FileFS.Read(buff,ll_Pos,1000); 
           SendData(buff); 
           ll_Pos=ll_Pos  +  1000; 
       } 
     FileFS.Close(); 
 
第一次可以取得前1000个字节,第二次就报错了: 
 
未处理的“System.ArgumentException”类型的异常出现在  mscorlib.dll  中。 
其他信息:  偏移和长度已超出数组界限,或者计数大于从索引到源集合末尾的元素数。 
 
怎么写才正确?
正确的写法:
FileStream fsIn = new FileStream(fileName, FileMode.Open, FileAccess.Read);

            string basePath = System.IO.Path.GetDirectoryName(fileName);

            int fileSize = (int) fsIn.Length;
            int segments = (int) (fileSize / m_segmentSize);
            int remainder = (int) (fileSize % m_segmentSize);

            if (remainder > 0) segments++;

            byte[] buffer = new byte[m_blockSize];

            int bytesRead = 0;
            try
            {
                for (int i = 0; i < segments; i++)
                {
                    FileStream fsOut = new FileStream(fileName + "." + i, FileMode.Create,FileAccess.Write);
                    int blocks = (int) (m_segmentSize / m_blockSize);

                    for ( int j = 0; j < blocks ; j++)
                    {
                        bytesRead = fsIn.Read(buffer, 0, m_blockSize);
                        fsOut.Write(buffer, 0, bytesRead);
                    }
                    fsOut.Close();
                    OnProgessNotify ( Utilities.GetPercentComplete(  i+1 , segments ) );
                }

                return (int) segments;
            }
            finally
            {
                OnProgessNotify( 100 );
                if ( fsIn != null ) fsIn.Close();
            }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值