日期:2014-05-18  浏览次数:20877 次

C#文件分割器,帮忙改下
//计算需要分配多少个文件
  void SaveFile(int much,int big) {//much是文件大小除分割大小big决定要分几块
  for (int i = 0; i < much; i++)
  {
  FileStream fs = new FileStream(txt_choice.Text, FileMode.Open);
  byte[] b = new byte[((i+1)*big*1024)];
  fs.Read(b, i * big * 1024, (i+1) * big * 1024);//循环到第二次 这里就会说溢出,改怎么写啊
  fs.Close();

  try
  {
  FileStream f = new FileStream(txt_Save.Text + i, FileMode.CreateNew);
  f.Write(b, i * big * 1024, (i + 1) * big * 1024);
  f.Close();
  }
  catch (Exception)
  {
  MessageBox.Show("分割失败,此文件已经存在!");
  }
  }
  FileStream fs1 = new FileStream(txt_choice.Text, FileMode.Open);
  int count = (int)fs1.Length - big * 1024;
  byte[] b1 = new byte[count*big*1024];
  MessageBox.Show(b1.Length.ToString());
  fs1.Read(b1, much * big * 1024, (int)fs1.Length);
  fs1.Close();
  FileStream f1 = new FileStream(txt_Save.Text + much, FileMode.CreateNew);
  f1.Write(b1, much * big * 1024, (int)f1.Length);
  f1.Close();
  }

就是用户输入要分割的文件,和分割的大小big,系统根据文件大小除big算出much需要分割成几块,这样分割后保存到一个地方去,现在主要是byte数组的大小,以及read截取的问题,有溢出,哪位大哥帮忙改下

------解决方案--------------------
fs.Read(b, i * big * 1024, (i+1) * big * 1024)
第二个参数,是说的在数组中的位置,不是文件的。Write也一样
要修改在文件中的位置,用fs.Seek
------解决方案--------------------
另外楼主循环部分貌似有问题,每次读取的大小还不一样,是故意这么弄的吗?如果是每次一样的话,给楼主大改下
C# code
void SaveFile(int big)
{
    string input = txt_choice.Text;
    string output = txt_Save.Text;
    int block = 10;
    using (FileStream read = File.OpenRead(input))
    {
        byte[] b = new byte[big * block];
        int count = read.Read(b, 0, big * block);
        int s = 0;
        while (count > 0)
        {
            FileStream write;
            try
            {
                write = new FileStream(output + s++, FileMode.CreateNew);
                write.Write(b, 0, count);
            }
            catch (Exception)
            {
                MessageBox.Show("分割失败,此文件已经存在!");
                break;
            }
            count = read.Read(b, 0, big * block);
        }
    }
}