Значение '101' недопустимо для 'Value'. 'Value' должно лежать в диапозоне от 'minimum' до 'maximum'. (Parameter 'value') Actual value was 101

Рейтинг: 0Ответов: 1Опубликовано: 13.07.2023

Я пишу код на C# для программы, которая очищает временные файлы (кэш-файлы), в таких директориях как: C:\Users\Имя пользователя\AppData\Local\Temp и в C:\Windows\Temp. При отладки программы появляется следующая ошибка:

Необрабатываемое исключение в приложении. При нажатии кнопки "Продолжить" приложение проигнорирует ошибку и попытается продолжить работу. При нажатии кнопки "Выход" приложение немедленно завершит работу.

Значение '101' недопустимо для 'Value'. 'Value' должно лежать в диапозоне от 'minimum' до 'maximum'. (Parameter 'value') Actual value was 101.

Подробная информация об использовании оперативной (JIT) отладки вместо данного диалогового окна содержится в конце этого сообщения.

************** Текст исключения **************

System.ArgumentOutOfRangeException: Значение '101' недопустимо для 'Value'. 'Value' должно лежать в диапазоне от 'minimum' до 'maximum'. (Parameter 'value') Actual value was 101.

at System.Windows.Forms.ProgressBar.set_Value(Int32 value) - at DebrisCleaner.Form1.ScanFolder(String folderPath, Int64& totalSize) in D:\Projects\DebrisCleaner\DebrisCleaner\Form1.cs:line 87

at DebrisCleaner.Form1.AnalyzeFolders() in D:\Projects\DebrisCleaner\DebrisCleaner\Form1.cs:line 64

at DebrisCleaner.Form1.<AnalyzeButton_Click>b__3_0() in D:\Projects\DebrisCleaner\DebrisCleaner\Form1.cs:line 29

at System.Threading.Tasks.Task`1.InnerInvoke() at System.Threading.Tasks.Task.<>c.<.cctor>b__272_0(Object obj) at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)

--- End of stack trace from previous location ---

at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)

--- End of stack trace from previous location ---

at DebrisCleaner.Form1.AnalyzeButton_Click(Object sender, EventArgs e) in D:\Projects\DebrisCleaner\DebrisCleaner\Form1.cs:line 29

at System.Threading.Tasks.Task.<>c.b__128_0(Object state)

Код C#:

private void ScanFolder(string folderPath, ref long totalSize)
    {
        var files = Directory.EnumerateFiles(folderPath, "*", SearchOption.AllDirectories)
            .Where(file => !IsSystemFile(file));

        foreach (var file in files)
        {
            try
            {
                totalSize += new FileInfo(file).Length;
                filesListBox.Items.Add(file);
            }
            catch (Exception)
            {
                // Ошибка доступа к файлу
            }

            ProgressBar.Value++
        }
    }

Ответы

▲ 1Принят

Ошибку даёт "progressBar.Value++", когда "progressBar.Value"=100. Нужно как-то предварительно оценить количество обрабатываемых объектов и привести это к 100%, чтобы "progressBar.Value" находилось в диапазоне от 0 до 100%:

private void ScanFolder(string folderPath, ref long totalSize)
{
    var files = Directory.EnumerateFiles(folderPath, "*", SearchOption.AllDirectories)
        .Where(file => !IsSystemFile(file));

    if (files is null) return; // на всякий случай, не уверен, что не может быть null
    var fc = files.Count(); // получаем кол-во файлов
    if (fc==0) return;
    double ttl = 0, dv = 100 / (double)fc; // вводим счётчик и инкремент, приведённый к 100%
    int lttl = 0;

    foreach (var file in files)
    {
        try
        {
            totalSize += new FileInfo(file).Length;
            filesListBox.Items.Add(file);
        }
        catch (Exception)
        {
            // Ошибка доступа к файлу
        }

        ttl += dv; // увеличиваем счётчик
        if ((int)ttl > lttl) progressBar.Value = lttl = (int)ttl; // это снизит частоту обновления ProgressBar, если время критично или очень много файлов, особенно маленьких
    }
}