首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

文件切割和合并的有关问题(多线程)

2011-12-19 
文件切割和合并的问题(多线程)privatevoidbutton3_Click(objectsender,EventArgse){fromfilethis.textBox

文件切割和合并的问题(多线程)
private   void   button3_Click(object   sender,   EventArgs   e)
                {
                        fromfile   =   this.textBox1.Text;
                        FileInfo   f   =   new   FileInfo(this.textBox1.Text);
                        int   size   =   ((int)f.Length);
                        int   num   =   Int32.Parse(this.comboBox1.SelectedItem.ToString());
                        step   =   size   /   num;
                        int   position   =   0;
                        Thread[]   threads   =   new   Thread[num];
                        for   (int   i   =   0;   i   <   num;   i++)
                        {
                                if   (i   !=   num   -   1)
                                {
                                        threads[i]   =   new   Thread(new   ParameterizedThreadStart(this.SplitFile));
                                        threads[i].Name   =   "part "   +   i;
                                        threads[i].Start(position);
                                        position   +=   step;
                                }
                        }
                        FileStream   fs   =   new   FileStream(fromfile,   FileMode.Open,   FileAccess.Read);
                        fs.Position   =   (num   -   1)   *   step   ;
                        byte[]   bytes   =   new   byte[size   -   fs.Position];
                        fs.Read(bytes,   0,   bytes.Length);
                        tofile   =   this.textBox2.Text   +   @ "\ "   +   Path.GetFileName(this.fromfile)   +   ".part "   +   (num   -   1);


                        fs   =   new   FileStream(tofile,   FileMode.Create,   FileAccess.Write);
                        fs.Write(bytes,   0,   bytes.Length);
                        fs.Flush();
                        fs.Close();
                }

                private   void   SplitFile(Object   position)
                {
                        byte[]   bytes   =   new   byte[step];
                        FileStream   fs   =   new   FileStream(fromfile,   FileMode.Open,   FileAccess.Read);
                        fs.Position   =   (int)position;
                        fs.Read(bytes,   0,   step);
                        tofile   =   this.textBox2.Text   +   @ "\ "   +Path.GetFileName(this.fromfile)   +   ". "+   Thread.CurrentThread.Name;
                        fs   =   new   FileStream(tofile,   FileMode.Create,   FileAccess.Write);
                        fs.Write(bytes,   0,   bytes.Length);
                        fs.Flush();
                        fs.Close();
                }

private   void   button7_Click(object   sender,   EventArgs   e)
                {
                        Thread[]   threads   =   new   Thread[files.Length];
                        target   =   this.textBox4.Text   +   @ "\ "   +   (Path.GetFileName(files[0])).Substring(0,   (Path.GetFileName(files[0])).LastIndexOf( '. '));
                        int   position   =   0;
                        for   (int   i   =   0;   i   <   files.Length;   i++)
                        {
                                FileInfo   f   =   new   FileInfo(files[i]);
                                threads[i]   =   new   Thread(new   ParameterizedThreadStart(this.CreateNew));
                                threads[i].Name   =   " "   +   i;


                                threads[i].Start(position);
                                position   +=   (int)f.Length;
                        }
                }

                private   void   CreateNew(Object   position)
                {
                        FileStream   fs   =   new   FileStream(files[(Int32.Parse(Thread.CurrentThread.Name))],   FileMode.Open,   FileAccess.Read);
                        byte[]   bytes   =   new   byte[(int)fs.Length];
                        fs.Read(bytes,0,bytes.Length);
                        fs   =   new   FileStream(target,   FileMode.OpenOrCreate,   FileAccess.Write);
                        fs.Position   =   (int)position;
                        fs.Write(bytes,   0,   bytes.Length);
                        fs.Flush();
                        fs.Close();
                }
上面的是切割,下面的是合并,切割运行后没问题,但是合并出来的文件顺序不对,是不是有必要要加同步,请大家指教.

[解决办法]
我觉得切割和合并都需要加同步,否则肯定有问题。
由于在外面用别人的机器上网,没有环境,所以没办法调式。先留个名,回去研究以下。
但估计问题是出在线程上面,加上同步试试先。
[解决办法]
你用的是2005吧.
你看有没有这种可能:在切割的时候,thread[n+1]比thread[n]先启动,那么你保存的文件顺序就和你想象中的不一样了.所以合并的时候会出现文件大小一样但是顺序不对的现象.可以用文本文件实验一下.

热点排行