метод рекурсивного поиска требует при запуске во второй раз, удвоенное количество времени - PullRequest
0 голосов
/ 12 октября 2011

У меня маленькая проблема. Я запрограммировал приложение winforms, которое рекурсивно ищет файлы в указанной папке и ее подпапках. Когда я запускаю приложение в первый раз, методу требуется 10 минут для поиска 100'000 файлов, но затем, когда я выполняю метод поиска во второй раз (без закрытия и повторного открытия окна), ему требуется удвоенное количество времени. почему это занимает вдвое больше времени?

редактировать: первый поиск: 10 минут, второй запуск: 20 минут, третий запуск 40 минут ...

вот мой метод поиска:

        public void dirsearch(string sdir)
        {
        this.Invoke((MethodInvoker)delegate
        {
            progressBar.Refresh();
            dataGridView.Refresh();
            // runs on UI thread
        });
            foreach (string d in Directory.GetDirectories(sdir))
            {
                try
                {
                    foreach (string f in Directory.GetFiles(d))
                    {
                        if (Regex.IsMatch(f, searchPattern, RegexOptions.IgnoreCase))
                        {
                            FileInfo file = new FileInfo(f);
                            string fileName = file.Name;
                            string filePath = f;
                            string user = File.GetAccessControl(filePath).GetOwner(typeof(System.Security.Principal.NTAccount)).ToString();
                            properties.Add(new FileProperties(file.Name, f, file.Length, file.LastWriteTime));
                            //dataGridView.Refresh();
                            //progressBar.Refresh();
                        tryagainpoint:
                            cmd.CommandText = String.Format("insert into Attribute (Dateiname, Dateipfad, Dateierstellungsdatum, Dateiendung, Grösse, Ersteller, Letztes_mal_bearbeitet, FS) values ('{0}', '{1}', '{2}', '{3}', {4}, '{5}', '{6}', {7})", file.Name, f, file.CreationTime, file.Extension, file.Length, user, file.LastWriteTime, ID);
                            try
                            {
                                cmd.ExecuteNonQuery();
                            }
                            catch (OleDbException)
                            {
                                if (file.Name.Contains(@"'"))
                                {
                                    fileName = file.Name.Replace(@"'", @"''");
                                    filePath = f.Replace(@"'", @"''");
                                    goto tryagainpoint;
                                }
                            }
                            finally
                            {
                                file = null;
                            }
                        }


                    }

                    dirsearch(d);
                    progressBar.MarqueeAnimationSpeed = 0;
                }

                catch (Exception exc) //Schreibt geworfene Exception in logfile.txt
                {
                    WriteExceptionIntoTxtFile(exc);
                    continue;
                }
        }
    }

1 Ответ

1 голос
/ 12 октября 2011

Вы очищаете коллекцию "свойства" между двумя вызовами.Если нет, эта коллекция будет содержать 100 000 записей в начале второго вызова этой функции и содержать 200 000 в конце.При использовании группирования существует проблема с производительностью сетки данных!

Кстати: код будет быстрее, если вы не обновите сетку данных и индикатор выполнения после каждого найденного файла!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...