Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Обработичк исключений c# / 25 сообщений из 62, страница 1 из 3
16.05.2019, 09:11
    #39813851
SAS2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Есть просто код ... который пробегает по datagridview определенного столбца, в котором список полного пути к конченому подкаталогу

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

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

Заранее спс

PS И еще вопрос ... кто нибудь скинет рабочий код, который позволяет при нажатие на кнопке "стоп" останавливать
BackgroundWorker
...
Рейтинг: 0 / 0
16.05.2019, 09:35
    #39813856
stomsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
SAS2014Есть просто код ... который пробегает по datagridview определенного столбца, в котором список полного пути к конченому подкаталогу
Круто ты описал процесс. Я аж только с третьего прочтения догадался о чем речь )))

SAS2014проблема в том, например открыт файл который находится в подкаталоге и при переименование подкааталога срабатывает исключение в вида такого что не возможно получить доступ к папке (файлу) то дальнейшие переименование других подкаталогов прерывается.
Я правильно догадался: у тебя есть функция, в которой есть цикл, в котором выполняется перебор путей и выполнение некоторых действий по этим путям (переименование файлов или каталогов)? И, если внутри цикла вылетает исключение (exception), то происходит вылет из цикла и перебор всех путей прерывается?

Что-то вроде этого:
Код: c#
1.
2.
3.
4.
5.
6.
7.
void MyFunction(string[] pathArray)
{
  foreach(string path in pathArray)
  {
    // здесь происходит переименование и может вылететь exception
  }
}



Если я прав, попробуй модифицировать код примерно так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
void MyFunction(string[] pathArray)
{
  foreach(string path in pathArray)
  try
  {
    // здесь происходит переименование и может вылететь exception
  }
  catch(Exception ex)
  {
    list1.Items.Add(path); // отображение проблемного пути
    MessageBox.Show(ex.Message); // вывод сообщения об ошибке для диагностики проблемы
  }
}



Ну или приведи фрагмент своего кода, чтобы говорить более конкретно.

SAS2014PS И еще вопрос ... кто нибудь скинет рабочий код, который позволяет при нажатие на кнопке "стоп" останавливать
BackgroundWorker
Более опытные коллеги меня поправят, но, по-моему, остановить работу BackgroundWorker можно только тогда, когда BackgroundWorker в своем DoWork проверяет не пришла ли команда на прерываниие выполнения. Если в DoWork такой проверки не выполнять, то остановить BackgroundWorker штатно нельзя. Тебя именно такой вариант интересует?
...
Рейтинг: 0 / 0
16.05.2019, 09:36
    #39813858
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
stomsky,
+1
...
Рейтинг: 0 / 0
16.05.2019, 09:37
    #39813859
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Так и проверяй перед переименованием, существует ли такой каталог.
...
Рейтинг: 0 / 0
16.05.2019, 09:40
    #39813861
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
BackgroundWorker в топку, Task с CancellationToken наше все.
...
Рейтинг: 0 / 0
16.05.2019, 09:43
    #39813863
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
ЕвгенийВ,
По справедливости, тот токен и есть то что выше stomsky сказал.
...
Рейтинг: 0 / 0
16.05.2019, 09:45
    #39813865
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Petro123,
Так то да, я к тому что с BackgroundWorker давно пора слезть.
...
Рейтинг: 0 / 0
16.05.2019, 09:52
    #39813878
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Petro123stomsky,
+1

не торопись, он еще не дописал код

авторкто нибудь скинет рабочий код, который позволяет при нажатие на кнопке "стоп" останавливать
BackgroundWorker
...
Рейтинг: 0 / 0
16.05.2019, 10:01
    #39813887
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Ролг Хупин,
Ты прав конечно)
...
Рейтинг: 0 / 0
16.05.2019, 12:16
    #39813965
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
ЕвгенийВBackgroundWorker в топку, Task с CancellationToken наше все.
ничего не мешает использовать CancellationToken вместе с BackgroundWorker
...
Рейтинг: 0 / 0
16.05.2019, 12:53
    #39813985
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
примерно, вот так
на форме 2 кнопки и 2 текст бокса
StartButton, CancelButton, SourceFolderTextBox и FolderSizeTextBox

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;

namespace BackgroundWorkerExample
{
    public partial class Form1 : Form
    {
        private BackgroundWorker _worker;
        public Form1()
        {
            InitializeComponent();
            ChangeButtonsState(false);
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            //Очищаем резултат
            FolderSizeTextBox.Text = string.Empty;
            //Создаем воркер
            _worker = new BackgroundWorker
            {
                WorkerSupportsCancellation = true
            };
            _worker.DoWork += BackgroundWorker_DoWork;
            _worker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
            _worker.RunWorkerAsync(SourceFolderTextBox.Text);
            //Меняем состояние кнопок
            ChangeButtonsState(true);
        }

        private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //Получаем результат
            long folderSize = (long)e.Result;
            //Сохраняем его в TextBox
            FolderSizeTextBox.Text = folderSize.ToString();
            //Меняем состояние кнопок
            ChangeButtonsState(false);
            //Высвобождаем worker
            _worker.Dispose();
            _worker = null;
        }
        /// <summary> Меняет состояние кнопок </summary>
        /// <param name="isWorking">Состояние выполнения</param>
        private void ChangeButtonsState(bool isWorking)
        {
            StartButton.Enabled = !isWorking;
            //Если Worker не поддерживает отмену, кнопка всегда будет выключенной
            CancelButton.Enabled = _worker?.WorkerSupportsCancellation == true && isWorking;
        }

        private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            //Сохраняем в результаты асинхронного выполнения размер папки
            e.Result = GetFolderSize((string)e.Argument);
        }

        /// <summary> Рекурсивно вычисляет размер папки </summary>
        /// <param name="folderPath">Путь к папке</param>
        /// <returns>Размер папки</returns>
        private long GetFolderSize(string folderPath)
        {
            long size = 0;

            try
            {
                string[] files = Directory.GetFiles(folderPath, "*");
                foreach (string file in files)
                {
                    //Если запрошена отмена кидаем исключение
                    if (_worker.CancellationPending) throw new OperationCanceledException();
                    var fileInfo = new FileInfo(file);
                    size += fileInfo.Length;
                }

                string[] folders = Directory.GetDirectories(folderPath, "*");
                foreach (string folder in folders)
                {
                    //Если запрошена отмена кидаем исключение
                    if (_worker.CancellationPending) throw new OperationCanceledException();
                    size += GetFolderSize(folder);
                }
            }
            catch (OperationCanceledException)
            {
                //так как операция отменена, результаты операции не известны
                return -1;
            }
            catch(Exception ex)
            {
                Debug.Print(ex.Message);
            }
            return size;
        }
        
        private void CancelButton_Click(object sender, EventArgs e)
        {
            //Если воркер поддерживает отмену, вызываем её
            if (_worker.WorkerSupportsCancellation) _worker.CancelAsync();
        }
    }
}
...
Рейтинг: 0 / 0
16.05.2019, 15:25
    #39814113
Супер_Пав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
ЕвгенийВPetro123,
Так то да, я к тому что с BackgroundWorker давно пора слезть.
Почему?
...
Рейтинг: 0 / 0
16.05.2019, 15:31
    #39814118
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Супер_ПавЕвгенийВPetro123,
Так то да, я к тому что с BackgroundWorker давно пора слезть.
Почему?депрекатед
...
Рейтинг: 0 / 0
16.05.2019, 15:36
    #39814126
Супер_Пав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Petro123Супер_Павпропущено...

Почему?депрекатед
Почему?
...
Рейтинг: 0 / 0
16.05.2019, 15:44
    #39814132
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Супер_Пав,
Со слов профи с большим количеством лайков)).
Вбей 2 слова в гугль и увидишь.
...
Рейтинг: 0 / 0
16.05.2019, 16:50
    #39814175
Супер_Пав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Petro123Супер_Пав,
Со слов профи с большим количеством лайков)).
Вбей 2 слова в гугль и увидишь.
а можно ссылку на профи? А то гугл забанили
...
Рейтинг: 0 / 0
16.05.2019, 17:09
    #39814188
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Супер_Павгугл забанили есть яндекс
...
Рейтинг: 0 / 0
16.05.2019, 17:52
    #39814215
Супер_Пав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Shocker.ProСупер_Павгугл забанили есть яндекс
Прочитал. Всё субъективно. Доводы автора "удобно/неудобно". В этом плане не может быть единого мнения. Ему удобно так, мне удобно иначе. Согласен, в каких-то моментах Task.Run смотрится удобней, а в каких-то нет.
Посему, каждый вправе сам решить, что для него удобно. Но говорить, что BW устарел и им не надо пользоваться - это навязывать мнение, в большинстве случаев даже не своё.
...
Рейтинг: 0 / 0
16.05.2019, 17:52
    #39814216
Супер_Пав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Shocker.ProСупер_Павгугл забанили есть яндекс
Спасибо за ссылку!
...
Рейтинг: 0 / 0
16.05.2019, 18:07
    #39814225
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Супер_Пав,
Да
Выбирай, кто тебе по душе и кого слушать.
https://stackoverflow.com/questions/12414601/async-await-vs-backgroundworker
...
Рейтинг: 0 / 0
16.05.2019, 18:37
    #39814232
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Супер_ПавПосему, каждый вправе сам решить, что для него удобно. Но говорить, что BW устарел и им не надо пользоваться - это навязывать мнение, в большинстве случаев даже не своё.TPL создан как замена для BW, вот и все. Ты можешь продолжать пользоваться хоть NET2.0, но всё меньше людей смогут давать тебе советы. Опять же, ты будешь использовать NET2.0 и спрашивать всех вокруг, почему ты должен переходить на другие версии? Потому что устарело - достаточно адекватный ответ.
...
Рейтинг: 0 / 0
16.05.2019, 19:09
    #39814249
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
ЕвгенийВBackgroundWorker в топку, Task с CancellationToken наше все.

Task не умеет репортить прогресс без, хоть и небольшого, но все же рукоблудия (и, кстати, уверен, что дохрена народу себе при этом в ногу выстрелят). А так, да, с таском удобнее.
...
Рейтинг: 0 / 0
16.05.2019, 19:43
    #39814260
Супер_Пав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Shocker.ProСупер_ПавПосему, каждый вправе сам решить, что для него удобно. Но говорить, что BW устарел и им не надо пользоваться - это навязывать мнение, в большинстве случаев даже не своё.TPL создан как замена для BW, вот и все. Ты можешь продолжать пользоваться хоть NET2.0, но всё меньше людей смогут давать тебе советы. Опять же, ты будешь использовать NET2.0 и спрашивать всех вокруг, почему ты должен переходить на другие версии? Потому что устарело - достаточно адекватный ответ.
Вы утрируете, говоря про net2. Чем BW устарел? Я вижу только аргументы в пользу "удобно/неудобно". Но как уже говорил - это субъективное мнение.В ИТ устарел - это жрет больше ресурсов, медленней работает и т.д. BW подходит под эти критерии? Нет. Тогда в чем он устарел? Больше символов печать надо? Ну для меня это по кайфу, если конечно речь не о копипасте и говнокоде
...
Рейтинг: 0 / 0
16.05.2019, 19:59
    #39814265
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Супер_ПавВ ИТ устарел - этоотсутствие комьюнити)))
...
Рейтинг: 0 / 0
16.05.2019, 20:00
    #39814266
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработичк исключений c#
Супер_ПавShocker.Proпропущено...
TPL создан как замена для BW, вот и все. Ты можешь продолжать пользоваться хоть NET2.0, но всё меньше людей смогут давать тебе советы. Опять же, ты будешь использовать NET2.0 и спрашивать всех вокруг, почему ты должен переходить на другие версии? Потому что устарело - достаточно адекватный ответ.
Вы утрируете, говоря про net2. Чем BW устарел? Я вижу только аргументы в пользу "удобно/неудобно". Но как уже говорил - это субъективное мнение.В ИТ устарел - это жрет больше ресурсов, медленней работает и т.д. BW подходит под эти критерии? Нет. Тогда в чем он устарел? Больше символов печать надо? Ну для меня это по кайфу, если конечно речь не о копипасте и говнокодеЯ уже сказал - чем дальше, тем меньше специалистов, готовых ответить тебе на вопросы по BW.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Обработичк исключений c# / 25 сообщений из 62, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]