Я создаю подпрограмму для своей основной. Её суть заключается в защите (шифровании) некоторых чувствительных данных от основной программы, её логов и прочих плюшек. Основная программа запускает дополнительную. Проблема в следующем методе:
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:\";
Если просто тупо все перебрать, то вот такая небольшая модификация Вашего кода это сделает:
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);
}
}
}
Ну и нужно помнить, что Вы ловите только один тип исключений, а при чтении каталогов и файлов могут возникнуть исключения других типов, которые Вы должны обработать. Где - это уже Вы должны решать сами, исходя из логики Вашего приложения.
Продвижение своими сайтами как стратегия роста и независимости