Lê Hiển Vinh Ответов: 4

C# как использовать if в foreach


MD5 для файлов:
a.exe :8A1C8273F25E920CA8809107B069AC8D
a1.exe : A8EF444D951FA378479A7C9D9611B6CC
2 файла находятся на рабочем столе

Мой код здесь:
private void Button6_Click(object sender, EventArgs e)
        {
            string[] source = new string[] { "8A1C8273F25E920CA8809107B069AC8D", "A8EF444D951FA378479A7C9D9611B6CC"};

            //string vr = 
            var files = System.IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.Desktop));
            try
            {
                foreach(var vr in files)
                {
                    
                    
                    var md5String = CreateMD5StringFromFile(vr); textBox1.Text = md5String.ToString();
                    if (source.Contains(md5String))
                    {
                        listBox1.Items.Add(vr);
                    }
                }

            }
            catch (Exception) { }
        }

когда button6 щелкнул, там только a.exe добавлено в список
помощь

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

Я думаю, что причина заключается в использовании if в foreach
есть ли решение для этого?

4 Ответов

Рейтинг:
2

OriginalGriff

На первый взгляд, один из файлов, которые он возвращает, не имеет правильных разрешений для вас, чтобы прочитать его - так что ваш try ... catch код улавливает исключение, и это завершает работу программы. for цикл - в "обычных папках" есть несколько файлов, которые являются только системными и которые вызывают такое поведение. Как и файл, открытый для эксклюзивного доступа другим приложением.

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

Перестаньте глотать исключения: это не "чудо-лекарство", чтобы исправить сбой вашего приложения, это способ сказать вам: "есть проблема, и вы с ней не справились". Проглатывание этого исключения не исправляет этого, оно просто прячет его на потом, когда оно вызывает еще больше проблем - как вы только что обнаружили...


Рейтинг:
2

BillWoodruff

Попробуйте переместить Try-Catch внутрь цикла ;foreach:

private void Button6_Click(object sender, EventArgs e)
{
    string[] source = new string[] { "8A1C8273F25E920CA8809107B069AC8D", "A8EF444D951FA378479A7C9D9611B6CC"};

    //string vr = 
    var files = System.IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.Desktop));

    foreach(var vr in files)
    {
        try
       { 
            var md5String = CreateMD5StringFromFile(vr); textBox1.Text = md5String.ToString();

            if (source.Contains(md5String))
            {
                listBox1.Items.Add(vr);
            }
        }                 
        catch (Exception ex)
        {
            Console.WriteLine($"error in file: {vr.FullName} | {ex.Message}");
        };
    }
}
Вы можете запустить это как "диагностику", чтобы увидеть возможные ошибки. После этого следует написать специальные обработчики для типов выдаваемых ошибок. Я действительно согласен с "никогда не проглатывайте ошибку, для которой вы не написали явный улов" ... разве что в отладке.

В этом потоке на StackOverFlow есть несколько интересных примеров новых способов в C#6 и #7 для обработки перехвата нескольких типов ошибок: [^]


Рейтинг:
0

Patrice T

Цитата:
когда button6 щелкнул, там только a.exe добавлено в список

Поведение вполне ожидаемо, если второй md5-это не то, что вы ожидаете.
Мы ничего не можем для вас сделать, только отладчик может вам помочь.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

Отладка кода C# в Visual Studio - YouTube[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
0

Dave Kreskowiak

Это определенно не потому, что вы используете IF в FOREACH. Нет ничего плохого или особенного в том, что IF используется в блоке FOREACH.

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