简单的线程问题,我想把一个大文件用5个线程转移复制到另一个目录下,但是为什么最后得到的新文件只有原文件的1/5
我才开始学线程 有很多地方不是很明白 希望各位能给点提示 帮忙看下是哪里有问题` !
 byte[] buf = null;
        private void button1_Click(object sender, EventArgs e)
        {
            
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                
                string path = openFileDialog1.FileName;
                label1.Text = "源路径:" + path.ToString();
                try
                {
                    FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);                     
                    fs.Read(buf, 0, buf.Length);
                }
                catch (Exception)
                {
                }
                
            }
        }
        
        private void button2_Click(object sender, EventArgs e)
        {
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                 string  path1 = saveFileDialog1.FileName;
                label2.Text = "源路径:" + path1.ToString();
                Thread th1 = new Thread(method1);
                Thread th2 = new Thread(method1);
                Thread th3 = new Thread(method1);
                Thread th4 = new Thread(method1);
                Thread th5 = new Thread(method1);
                th1.Start();              
                th2.Start();             
                th3.Start();
                th4.Start();
                th5.Start();
            }
        }
        public void method1()
        {            string path2 = openFileDialog1.FileName;
            try
            {
                FileStream fs = new FileStream(path2, FileMode.Open, FileAccess.ReadWrite,FileShare .ReadWrite);
                long leng = fs.Length/5;
                buf = new byte[leng];
                
                fs.Seek(0  , SeekOrigin.Begin);
                fs.Read(buf, 0, buf.Length);
                fs.Write(buf, 0, buf.Length);
                fs.Close();               
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }        }

解决方案 »

  1.   

    写文件是exclusive性质的操作,你也写方式打开一个文件,就不能再以写方式打开这个文件了。不要再线程中打开 -- FileStream fs = new FileStream(path2, FileMode.Open, FileAccess.ReadWrite,FileShare .ReadWrite); 
    在启动线程前创建这个对象,然后作为参数传到线程里。另外线程中
    fs.Seek(0  , SeekOrigin.Begin); 
                    fs.Read(buf, 0, buf.Length); 
                    fs.Write(buf, 0, buf.Length); 
                    fs.Close();              每次都从0开始写,后面的会覆盖前面的。需要每个线程负责写入的段的起始位置作为参数传给线程。我觉得多线程写一个文件不是一个好注意,说不定
    FileStream 内部会有lock什么的同步机制。
      

  2.   


     byte[] buf = null;
            private void button1_Click(object sender, EventArgs e)
            {
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    string path=openFileDialog1 .FileName ;
                    FileStream fs=new FileStream (path ,FileMode.Open,FileAccess .Read);
                    buf = new byte[fs.Length];
                    fs.Read(buf, 0, buf.Length);
                   
                }
            }        private void button2_Click(object sender, EventArgs e)
            {
                string path = saveFileDialog1.FileName;
                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                {            
                    Thread th = new Thread(method);
                    th.Start();
                    save();
                }
            }
            public void method()
            {
                string path = openFileDialog1.FileName;
                try
                {
                    FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read);
                    fs.Seek (0,SeekOrigin.Begin);
                    fs.Read(buf, 0, buf.Length);
                    fs.Close();
                    
                }
                catch (Exception)
                {
                }
            }
            public void save()
            {
                string path = saveFileDialog1.FileName;
                try
                {
                    FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
                    fs.Write (buf, 0, buf.Length);
                    fs.Close();
                }
                catch (Exception)
                {
                }
            }
        } 这是我用一个线程做的不晓得有没有问题麻烦帮忙看下 小弟出学 
     能把文件复制到新的目录下 但是用5个怎么做了 就向上面那样 有问题
     谢谢啦