读书人

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

发布时间: 2011-12-19 23:23:36 作者: rapoo

文件切割和合并的问题(多线程)
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]先启动,那么你保存的文件顺序就和你想象中的不一样了.所以合并的时候会出现文件大小一样但是顺序不对的现象.可以用文本文件实验一下.

读书人网 >C#

热点推荐