Пытаюсь написать программку многопоточного копирования файлов. Один поток читает, другой пишет. Использую очередь, для записи сохраненных данных. Что-то он записывает больше байт чем нужно? В чём трабла. Многопоточность пока не делал, после запуска первого потока сделал задержку, что бы успел прочиать данные. PHP: class Program { // размер буффера private const int lengthBuffer = 10960; // очередь для храения буффера private static Queue<byte[]> queue = new Queue<byte[]>(); private static FileStream file; private static FileStream newfile; private static byte[] buffer; static void Main(string[] args) { Console.WriteLine("###Многопоточное копирование файлов!###"); Console.WriteLine("Введите путь к файлу, который нужно скопировать:"); string pathcopy = Console.ReadLine(); Console.WriteLine("Введите путь куда нужно вставить файл:"); string pathpaste = Console.ReadLine(); // поток для чтения файла file = new FileStream(@"" + pathcopy, FileMode.Open); // поток для записи файлов newfile = new FileStream(@"" + pathpaste, FileMode.Create); // массив байтов buffer = new byte[lengthBuffer]; Thread threadRead = new Thread(Read); threadRead.Start(); // делаю задержку чтобы успела прочитать Thread.Sleep(2000); Thread threadWrite = new Thread(Write); threadWrite.Start(); Console.ReadLine(); } static void Read() { while (file.Length != file.Position) { file.Read(buffer, 0, lengthBuffer); queue.Enqueue(buffer); } Console.WriteLine(file.Position+"-"+file.Length); Console.WriteLine("Поток чтения завершился!"); } static void Write() { while (queue.Count!=0) { newfile.Write(queue.Dequeue(), 0, lengthBuffer); } Console.WriteLine(newfile.Position + "-" + newfile.Length); Console.WriteLine("Поток записи завершился!"); } }
Чую опять меня будут пинать(в прошлый раз каюсь был не прав). Первый вопрос зачем так извращаться?(что простого File.Copy(file_in,file_out); недостаточно?) Ну ладно Автору виднее. (может там что то при копировании с потоком автор мудрит не знаю). Второй вопрос зачем ставить константный размер буфера?(Что то я сомневаюсь что все файлы у автора одного размера). Code: class Program { // размер буффера // private const int lengthBuffer = 10960; [COLOR=Red]private static int lengthBuffer = 0;[/COLOR] // очередь для храения буффера private static Queue<byte[]> queue = new Queue<byte[]>(); private static FileStream file; private static FileStream newfile; private static byte[] buffer; static void Main(string[] args) { Console.WriteLine("###Многопоточное копирование файлов!###"); Console.WriteLine("Введите путь к файлу, который нужно скопировать:"); string pathcopy = Console.ReadLine(); Console.WriteLine("Введите путь куда нужно вставить файл:"); string pathpaste = Console.ReadLine(); // поток для чтения файла file = new FileStream(@"" + pathcopy, FileMode.Open); [COLOR=Red] lengthBuffer =(int) file.Length;//узнаем нужный нам размер[/COLOR] // поток для записи файлов newfile = new FileStream(@"" + pathpaste, FileMode.Create); // массив байтов buffer = new byte[lengthBuffer]; Thread threadRead = new Thread(Read); threadRead.Start(); // делаю задержку чтобы успела прочитать Thread.Sleep(2000); Thread threadWrite = new Thread(Write); threadWrite.Start(); Console.ReadLine(); } static void Read() { while (file.Length != file.Position) { file.Read(buffer, 0, lengthBuffer); queue.Enqueue(buffer); } Console.WriteLine(file.Position + "-" + file.Length); Console.WriteLine("Поток чтения завершился!"); } static void Write() { while (queue.Count != 0) { newfile.Write(queue.Dequeue(), 0, lengthBuffer); } Console.WriteLine(newfile.Position + "-" + newfile.Length); Console.WriteLine("Поток записи завершился!"); } } Ну а остальной код в общем автору виднее.