Многопоточное копирование файлов C#

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by IgrikX, 19 Nov 2010.

  1. IgrikX

    IgrikX New Member

    Joined:
    13 Aug 2009
    Messages:
    114
    Likes Received:
    1
    Reputations:
    -3
    Пытаюсь написать программку многопоточного копирования файлов. Один поток читает, другой пишет. Использую очередь, для записи сохраненных данных. Что-то он записывает больше байт чем нужно? В чём трабла.
    Многопоточность пока не делал, после запуска первого потока сделал задержку, что бы успел прочиать данные.
    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(@"" pathcopyFileMode.Open);
                
    // поток для записи файлов
                
    newfile = new FileStream(@"" pathpasteFileMode.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(buffer0lengthBuffer);
                    
    queue.Enqueue(buffer);
                }
                
    Console.WriteLine(file.Position+"-"+file.Length);
                
    Console.WriteLine("Поток чтения завершился!");
            }

            static 
    void Write()
            {
                while (
    queue.Count!=0)
                {
                    
    newfile.Write(queue.Dequeue(), 0lengthBuffer);
                }
                
    Console.WriteLine(newfile.Position "-" newfile.Length);
                
    Console.WriteLine("Поток записи завершился!");
            }
        }

     
  2. lokli

    lokli New Member

    Joined:
    28 Dec 2009
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Чую опять меня будут пинать(в прошлый раз каюсь был не прав). Первый вопрос зачем так извращаться?(что простого 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("Поток записи завершился!");
            } 
        }
    Ну а остальной код в общем автору виднее. :)