Как синхронизировать индикатор выполнения с процессом - PullRequest
2 голосов
/ 19 мая 2019

В настоящее время я создаю средство копирования файлов, которое работает на консоли.В нем существует 3 базовых класса, первый - это сама программа, которая берет источник и назначение и выглядит следующим образом:

 class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Source:");
            string path = Console.ReadLine();

            Console.WriteLine("target:");

            string target = Console.ReadLine();


            Copy newCopy = new Copy();
            newCopy.CopyFunction(path, target);

            Console.ReadLine();
        }
    }

Второй класс - это Copy.CS, который выглядит следующим образом:

class Copy

    {
        public void CopyFunction(string source, string destination)
        {
            string sourceFile = source;
            string destinationFile = destination;

            File.Copy(sourceFile, destinationFile);

            Console.Write("Files are being copied... ");
            using (var progress = new ProgressBar())
            {
                for (int i = 0; i <= 100; i++)
                {
                    progress.Report((double)i / 100);
                    Thread.Sleep(20);
                }
            }

            Console.WriteLine("File Copied");         

        }

    }

В последнем классе я реализовал класс ProgressBar.cs, предоставленный @ DanielWolf

https://gist.github.com/DanielSWolf/0ab6a96899cc5377bf54

Проблема, с которой я сейчас сталкиваюсь, заключается в том, чтоФункция копирования файлов работает, как и индикатор выполнения, но они работают отдельно.Например, консоль будет проводить некоторое время на пустом экране, пока обрабатывает происходящее, а затем, после ее завершения, отображается быстрая анимация индикатора выполнения.

Мне было интересно, смогу ли я синхронизировать прогрессполоса с процессом копирования, чтобы он двигался с той же скоростью, пока он происходит?

1 Ответ

2 голосов
/ 19 мая 2019

Чтобы достичь того, что вы хотите сделать, вам нужно обновить индикатор выполнения при копировании файла. Один из способов сделать это - просто скопировать файл по блокам и сообщить о ходе выполнения каждого блока. Я изменил ваш CopyFunction, чтобы сделать именно это. Наслаждайтесь! * * 1002

class Copy

{
    public void CopyFunction(string sourcePath, string destinationPath)
    {
        byte[] buffer = new byte[1024 * 10]; // 10K buffer, you can change to larger size.

        using (var progress = new ProgressBar())
        using (FileStream source = new FileStream(sourcePath, FileMode.Open, FileAccess.Read))
        {
            long fileLength = source.Length;
            using (FileStream dest = new FileStream(destinationPath, FileMode.Create, FileAccess.Write))
            {
                long totalBytes = 0;
                int currentBlockSize = 0;

                while ((currentBlockSize = source.Read(buffer, 0, buffer.Length)) > 0)
                {
                    totalBytes += currentBlockSize;
                    dest.Write(buffer, 0, currentBlockSize);
                    progress.Report((double)totalBytes / fileLength);

                }
                progress.Report((double)1.0);
            }

            //File.Copy(sourceFile, destinationFile);

            //Console.Write("Files are being copied... ");
            //using (var progress = new ProgressBar())
            //{
            //    for (int i = 0; i <= 100; i++)
            //    {
            //        progress.Report((double)i / 100);
            //        Thread.Sleep(20);
            //    }
            //}

            Console.WriteLine("File Copied");

        }
    }
}
...