Member 8010354 Ответов: 1

Как добавить индикатор выполнения с подсчетами при копировании файлов


Привет,

Моя задача-скопировать выбранные файлы формата (.tif, tiff, .jpg и .jpeg) из одного места в другое с помощью разработанного мной приложения.

Задача выполнена успешно, но нужно добавить индикатор выполнения, который должен показывать количество и процент файлов, скопированных в пункт назначения.

Ниже приведен код страницы:


Copying the files from one location to other with folder threshold
            if (!int.TryParse(textBox3.Text, out int thresholdValue) || thresholdValue < 1)
            {
                // TODO: Display an error message to the user
                return;
            }

            string source = textBox1.Text;
            string destination = textBox2.Text;
            int totalFileCount = 0;
            int currentSubFolder = 0;
            int remainingFileCount = 0;
            string destinationFolder = null;

            ISet<string> extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
    ".tif",
    ".tiff",
    ".jpg",
    ".jpeg"
};

            IEnumerable<string> files = Directory
                .EnumerateFiles(source, "*", SearchOption.AllDirectories)
                .Where(f => extensions.Contains(Path.GetExtension(f)));

            foreach (string sourceFile in files)
            {
                if (remainingFileCount == 0)
                {
                    // First file, or the sub-folder is full:
                    currentSubFolder++;
                    destinationFolder = Path.Combine(destination, currentSubFolder.ToString("D3"));
                    if (!Directory.Exists(destinationFolder)) Directory.CreateDirectory(destinationFolder);
                    remainingFileCount = thresholdValue;
                }

                string destinationFile = Path.Combine(destinationFolder, Path.GetFileName(sourceFile));
                File.Copy(sourceFile, destinationFile);
                totalFileCount++;
                remainingFileCount--;   
            }

            MessageBox.Show("All " + totalFileCount + " files are copied");


Что я уже пробовал:

я попытался добавить индикатор выполнения, взяв объект, но он все еще не работает.

Member 8010354

спасибо

1 Ответов

Рейтинг:
1

OriginalGriff

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

Переместите свой код, чтобы фактически выполнить перемещение в Новый Поток и сообщить о прогрессе обратно в основной поток, и он будет работать. Самый простой способ сделать это - через фонового работника:

private void FrmMain_Shown(object sender, EventArgs e)
    {
    BackgroundWorker work = new BackgroundWorker();
    work.WorkerReportsProgress = true;
    work.DoWork += Work_DoWork;
    work.ProgressChanged += Work_ProgressChanged;
    work.RunWorkerCompleted += Work_RunWorkerCompleted;
    work.RunWorkerAsync();
    }

private void Work_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    // Do whatever is necessary after worker complete
    }

private void Work_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
    // Do display updates as files get copied
    }

private void Work_DoWork(object sender, DoWorkEventArgs e)
    {
    // Do the actual file copy and use ReportProgress to update the display.
    }