Pergunta

Estou tentando iterar os itens no meu menu Iniciar, mas continuo recebendo a AuthorizedAccessException não autorizada. Sou o proprietário do diretório e meu usuário é um administrador.

Aqui está o meu método (está em um projeto de DLL):

// root = C:\Users\Fernando\AppData\Roaming\Microsoft\Windows\Start Menu
private void walkDirectoryTree(DirectoryInfo root) {
    try {
        FileInfo[] files = root.GetFiles("*.*");
        foreach (FileInfo file in files) {
            records.Add(new Record {Path = file.FullName});
        }
        DirectoryInfo[] subDirectories = root.GetDirectories();
        foreach (DirectoryInfo subDirectory in subDirectories) {
            walkDirectoryTree(subDirectory);
        }
    } catch (UnauthorizedAccessException e) {
        // do some logging stuff
        throw; //for debugging
    }
}

O código falha quando começa a iterar sobre os subdiretos. O que mais devo fazer? Eu já tentei criar o arquivo manifesto, mas não funcionou. Outro ponto (se for relevante): estou apenas executando alguns testes de unidade com o Visual Studio (que é executado como administrador).

Foi útil?

Solução

Com base na sua descrição, parece que existe um diretório no qual seu usuário não tem acesso ao executar com o UAC ativado. Não há nada inerentemente errado com seu código e o comportamento nessa situação é por design. Não há nada que você possa fazer no seu código para contornar o fato de que sua conta não tem acesso a esses diretórios no contexto em que está em execução no momento.

O que você precisará fazer é explicar o diretório ao qual não tem acesso. A melhor maneira é provavelmente adicionando alguns métodos de extensão. Por exemplo

public static FileInfo[] GetFilesSafe(this DirectoryRoot root, string path) {
  try {
    return root.GetFiles(path);
  } catch ( UnauthorizedAccessException ) {
    return new FileInfo[0];
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top