Вопрос по c#, exception, permissions, file-permissions – C # - не может получить доступ ко всем файлам

2

Мое приложение использует объект .NETDirectory.GetFiles()

Фактическая перегрузка I 'м с помощью

var allFiles = Directory.GetFiles("C:\\Users\\Dave", "*.*", SearchOption.AllDirectories);

Проблема в том, что исходная папка - C: \ Users \ UserName, когда она пытается просмотреть папку с данными приложения.

Когда он пытается прочитать из папки данных приложения, выдается исключение: "

Доступ к тропеC: \ Users \ Dave \ AppData \ Local \ Application Data ' отказано."

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

Если это помогает, цель этого состоит в том, чтобы взять все файлы, извлеченныеDirectory.GetFiles() а также 'вставить' их еще где (прославленная копия и вставка / резервное копирование). Я'Я на самом деле не слишком беспокоюсь о системных файлах, простопользовательские файлы ».

Хороший вопрос - на данный момент, это на моем домашнем ПК - это мой аккаунт, ям админ с полными правами. Хотя я нене знаю, работает ли моя программа с полными правами, как яm запуск VS в режиме отладки (если быть точным, используя MS TESTS) Dave
Под каким аккаунтом работает ваша программа? mbarthelemy
@SimonWhitehead; отличное предложение, но, к сожалению, та же ошибка сохраняется. Dave
Если вы запускаете Visual Studio от имени администратора (щелкните правой кнопкой мыши> Запуск от имени администратора) это работает? Simon Whitehead

Ваш Ответ

2   ответа
1

к которым вы можете получить доступ:

DirectoryInfo dI = new DirectoryInfo(@"C:\Users\Dave");
List<string> files = new List<string>();
foreach (DirectoryInfo subDI in dI.GetDirectories())
{
        if ((subDI.Attributes & (FileAttributes.ReparsePoint | FileAttributes.System)) !=
        (FileAttributes)0)
              continue;
        files.Add(subDI.FullName);
}
</string></string>
Спасибо, это может быть лучшим подходом для моего приложения. Спасибо +1 Dave
3

%AppData% каталог, защищенный системой Windows попытается заблокировать любой доступ к этому каталогу, как только доступ не будет авторизован (доступ от другого пользователя, кроме администратора).

Только администратор по умолчанию имеет права на чтение и запись из / в этот каталог.

Кроме того, вы можете поймать исключение и посмотреть, если результатAccess Denied, Затем вы можете предложить пользователю запускаться от имени администратора для завершения этого шага. Вот'Простой пример, чтобы предложить пользователю работать от имени администратора

try
{
     var allFiles = Directory.GetFiles("C:\\Users\\Dave", "*.*", SearchOption.AllDirectories);
}
catch (Exception EX)
{
     if (EX.Message.ToLower().Contains("is denied."))
     {
          ProcessStartInfo proc = new ProcessStartInfo();
          proc.UseShellExecute = true;
          proc.WorkingDirectory = Environment.CurrentDirectory;
          proc.FileName = Application.ExecutablePath;
          proc.Verb = "runas"; //Required to run as Administrator
          try
          {

          Process.Start(proc);

          }
          catch
          {
               //The user refused to authorize
          }
     }
}

Однако вы всегда можете предложить пользователю авторизоваться при запуске приложения, что НЕ всегда РЕКОМЕНДУЕТСЯ. Для этого тыпридется редактировать ваш проектapp.manifest файл

Найдите и измените следующую строку

<requestedexecutionlevel level="asInvoker" uiaccess="false">
</requestedexecutionlevel>

в

<requestedexecutionlevel level="requireAdministrator" uiaccess="false">
</requestedexecutionlevel>

Спасибо,

Я надеюсь, что вы найдете это полезным :)

@DaveRook Извините за недоразумение, яя рад, что тыМы нашли решение вашей проблемы. Удачи в настройке вашего приложения. Хорошего дня :) Picrofo Software
@DaveRook Вы также можете использовать это!Environment.ExpandEnvironmentVariables("%AppData%"); но я не думаю, что этоХорошая практика программирования. Вы всегда можете предложить пользователю авторизоваться, а если он отказывается, вы можете пропустить обработку этой папки. Всем хорошего дня :) Picrofo Software
извините, я имел в виду использовать if (Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData) .Contains (sourceFolder)) .. однако, я понимаю, что может быть довольно много, что мне нужно настроить для: S Dave
Хорошо, это то, о чем я догадывался, но не смог узнать наверняка, так что спасибо, это действительно хорошая деталь. Интересно, может быть, лучше проверить, соответствует ли путь к файлу папки% appdata% с помощью метода Environment.GetSpeicalFolder () и если он совпадает, пропустите его просто потому, что я нене хочу полагаться на уловы, где это возможно! +1 Dave

Похожие вопросы