Отловить UnauthorizedAccessException при обходе папок

161
03 января 2020, 23:40

Я создаю подпрограмму для своей основной. Её суть заключается в защите (шифровании) некоторых чувствительных данных от основной программы, её логов и прочих плюшек. Основная программа запускает дополнительную. Проблема в следующем методе:

public void encryptDirectory(string location, string password)
{
var validExtensions = new[]
{
".svlog", ".wtc", ".superad", ".passr"
};
string[] files = Directory.GetFiles(location);
string[] childDirectories = Directory.GetDirectories(location);
for (int i = 0; i < files.Length; i++)
{
string extension = Path.GetExtension(files[i]);
if (validExtensions.Contains(extension))
{
EncryptFile(files[i], password);
}
}
for (int i = 0; i < childDirectories.Length; i++)
{
encryptDirectory(childDirectories[i], password);
}
} 

Всё хорошо работает, если я использую папку в документах пользователя. Но было решено сделать поиск по всему диску C этих расширений. При этом папка может быть создана где угодно и называться как угодно. Проблемы начинаются, когда я попадаю, например, в папку Documents and settings - вылетает exception доступа к директории и программа падает на строке:

string[] files = Directory.GetFiles(location);

Была идея использовать конструкцию try {} catch (UnauthorizedAccessException) {} но как это сделать, чтобы программа затем продолжила поиск? В location лежит такой путь: C:\ Если не затруднит, объясните подробней как с этим бороться? Метод вызывается так: encryptDirectory(EnPath, password); где string EnPath = "C:\";

Answer 1

Если просто тупо все перебрать, то вот такая небольшая модификация Вашего кода это сделает:

    public void encryptDirectory(string location, string password)
    {
        var validExtensions = new[]
        {
            ".svlog", ".wtc", ".superad", ".passr"
        };
        string[] files=null;
        try
        {
            files = Directory.GetFiles(location);
        }
        catch(UnauthorizedAccessException e)
        {
            //Пишите если нужно что-то в log
        }
        if (files != null)
        {
            for (int i = 0; i < files.Length; i++)
            {
                string extension = Path.GetExtension(files[i]);
                if (validExtensions.Contains(extension))
                {
                    EncryptFile(files[i], password);
                }
            }
        }

        string[] childDirectories = null;
        try
        {
            childDirectories = Directory.GetDirectories(location);
        }
        catch (UnauthorizedAccessException e)
        {
            //Пишите если нужно что-то в log
        }
        if (childDirectories != null)
        {
            for (int i = 0; i < childDirectories.Length; i++)
            {
                encryptDirectory(childDirectories[i], password);
            }
        }
    }

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

READ ALSO
Значения по умолчанию в моделях EF

Значения по умолчанию в моделях EF

Создал проект на aspnet mvc

187
ScrollViewer поверх дочернего ScrollViewer

ScrollViewer поверх дочернего ScrollViewer

Глобальный скролл прокручивается пока мышкой не попадаешь на область UserContol'a, у которого свой горизонтальный скроллВ итоге чтобы увидеть...

197
Как добавить разделитель/сепаратор в StatusStrip?

Как добавить разделитель/сепаратор в StatusStrip?

Как добавить разделитель/сепаратор/вертикальную разделительную линию в StatusStrip?

225
Невозможно удалить элемент из бд

Невозможно удалить элемент из бд

Возник вопросВо время добавления элемента (объекта) в БД всё работает и отображается как положено

214