Проблема с удалением файлов
int i = 0;
string[] AllFoundFiles = Directory.GetFiles(@"C:\Users\", "*.exe", SearchOption.AllDirectories).Select(fn => Path.GetFileName(fn)).ToArray();
string[] AllFoundFiles2 = Directory.GetFiles(@"C:\Users\", "*.exe", SearchOption.AllDirectories);
private void fff()
{
int iteration = AllFoundFiles.Length;
Label[] label1 = new Label[iteration];
Button[] button = new Button[iteration];
;
for (; i < iteration; i++)
{
label1[i] = new Label();
label1[i].Location = new Point(120, 60 + i * 31);
label1[i].Width = 300;
label1[i].Text = AllFoundFiles[i];
label1[i].Font = new Font("Microsoft Sans Serif", 15);
tabControl1.TabPages[0].Controls.Add(label1[i]);
label1[i].BringToFront();
tabControl1.TabPages[0].Controls.Add(label1[i]);
label1[i].BringToFront();
button[i] = new Button();
button[i].BringToFront();
button[i].Location = new Point(450, 60 + i * 31);
button[i].Text = "Удалить";
button[i].Name = AllFoundFiles2[i];
button[i].Font = new Font("Microsoft Sans Serif", 10);
button[i].Click += ButtonOnClick;
tabControl1.TabPages[0].Controls.Add(button[i]);
button[i].BringToFront();
panel2.BringToFront();
}
}
public void ButtonOnClick(object sender, EventArgs eventArgs)
{
DialogResult Messagedelete = MessageBox.Show(
"Вы точно хотите удалить этот файл?Вернуть его будет не возможно",
"Information",
MessageBoxButtons.YesNo,
MessageBoxIcon.Information,
MessageBoxDefaultButton.Button1
);
if (Messagedelete == DialogResult.Yes)
{
var button = (Button)sender;
File.Delete(button.Name);
tabControl1.TabPages[0].Controls.Remove(button);
for (int i = 0; i < AllFoundFiles.Length; i++)
{
Label label = new Label();
label.Location = new Point(450, 60 + i * 31);
label.Text = "Удалён";
label.Font = new Font("Microsoft Sans Serif", 15);
tabControl1.TabPages[0].Controls.Add(label);
}
}
}
Всем добрый день, я делаю поиск всех файлов на диске С, и мне выдает ошибку UnauthorizedAccessException, но решить через пустой catch нельзя так как массив где хранится все файлы используется в двух методах, вынести try catch тоже нельзя, как быть?
Ответы (1 шт):
Сделаю ревью вашего кода.
Что это за название: fff? Что делает этот метод? Фыфыкает?
Он создаёт контролы, предназначенные для удаления файлов. Поэтому можно назвать метод, например, CreateDeleteControls.
Вы дважды обращаетесь к файловой системе: Directory.GetFiles получая одни и те же файлы. А это весьма накладная операция, если файлов окажется много.
Можно поступить так (и сделать эти массивы локальными):
string[] FoundFiles = Directory.GetFiles(@"C:\Users\", "*.exe", SearchOption.AllDirectories);
string[] FoundNameFiles = FoundFiles.Select(fn => Path.GetFileName(fn)).ToArray();
Но от второго массива можно вообще избавиться. Ниже я покажу, как.
Почему i является полем формы? Это должна быть локальная переменная.
Некоторые куски кода вы вызываете дважды. Например:
button[i].BringToFront();
Будьте внимательнее, удаляйте такие повторы.
Ещё пара слов о нейминге.
Обработчик нажатия кнопок я бы назвал DeleteButton_Click. Это стандартный шаблон именования.
Названия массивов у вас:
Label[] label1
Button[] button
Ну что это такое? Названия коллекций должны быть во множественном числе: buttons, labels.
А самое главное - они вообще не нужны. Создаваемые контролы помещаются в коллекцию Controls. Массивы можно убрать.
Создание шрифтов - довольно тяжёлая операция. Поэтому лучше сделать шрифты полями формы и далее назначать их.
Теперь посмотрим на код в обработчике события.
В заголовке MessageBox'а обычно показывают название приложения.
Иконка должна быть либо MessageBoxIcon.Warning (предупреждение) - ведь удаление файла потенциально опасно, либо MessageBoxIcon.Question - вы же вопрос задаёте: "Удалить?"
В цикле добавляются лейблы "Удалён" для всех файлов. Просто их не видно под кнопками. Не стоит так делать. Это и затраты ресурсов, и будет совершенно непонятно, зачем так сделано, тому, кто будет поддерживать этот код в будущем.
Индекс i можно было бы передавать в свойстве Tag кнопки. Примерно так же, как вы передаёте название файла в свойстве Name.
При создании кнопки: button.Tag = i;
Его получение в событии: int i = (int)button.Tag;.
Но можно поступить ещё проще. Лейбл с надписью "Удалён" помещается в те же координаты, где была кнопка. Вот координаты кнопки и возьмём.
В итоге код может выглядеть так:
private readonly Font bigFont = new Font("Microsoft Sans Serif", 15);
private readonly Font smallFont = new Font("Microsoft Sans Serif", 10);
private void CreateDeleteControls()
{
try
{
string[] filesToDelete = Directory.GetFiles(
@"C:\Users\", "*.exe", SearchOption.AllDirectories);
for (int i = 0; i < filesToDelete.Length; i++)
{
var label = new Label
{
Location = new Point(120, 60 + i * 31),
Width = 300,
Text = Path.GetFileName(filesToDelete[i]),
Font = bigFont
};
tabControl1.TabPages[0].Controls.Add(label);
var button = new Button
{
Location = new Point(450, 60 + i * 31),
Text = "Удалить",
Name = filesToDelete[i],
Font = smallFont
};
button.Click += DeleteButton_Click;
tabControl1.TabPages[0].Controls.Add(button);
}
}
catch (Exception e)
{
MessageBox.Show(e.Message, "Название приложения",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
public void DeleteButton_Click(object sender, EventArgs eventArgs)
{
DialogResult dialogResult = MessageBox.Show(
"Вы точно хотите удалить этот файл? Вернуть его будет не возможно",
"Название приложения",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button1
);
if (dialogResult == DialogResult.Yes)
{
try
{
var button = (Button)sender;
File.Delete(button.Name);
tabControl1.TabPages[0].Controls.Remove(button);
var label = new Label
{
Location = button.Location,
Text = "Удалён",
Font = bigFont
};
tabControl1.TabPages[0].Controls.Add(label);
}
catch (Exception e)
{
MessageBox.Show(e.Message, "Название приложения",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
Учтите, что все обращения к файловой системе: Directory.GetFiles, File.Delete - могут привести к исключениям. Поэтому их обязательно следует обернуть в try-catch.
Названия файлов в разных папках могут совпадать. Вы же получаете файлы с опцией SearchOption.AllDirectories - в текущем каталоге и подкаталогах. А выводите вы только имя файла без пути. В итоге пользователь не будет знать, из какой папки он удаляет файл. Я бы показывал полный путь.
Кроме того, вместо ручного задания координат: 120, 60 + i * 31 я бы применил, например, TableLayoutPanel. Он автоматически расставит контролы по строкам и колонкам.