Pregunta

Estoy tratando de iterar sobre los artículos en mi menú de inicio, pero sigo recibiendo el UnauthorizedAccessException. Soy el dueño del directorio y mi usuario es un administrador.

Aquí es mi método (está en un proyecto 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
    }
}

El código de fallo cuando comienza a iterar sobre los subdirectorios. ¿Que más deberia hacer? Ya he tratado de crear el archivo de manifiesto, pero no funcionó. Otro de los puntos (si es relevante):. Sólo estoy corriendo algunas pruebas unitarias con Visual Studio (que se ejecuta como administrador)

¿Fue útil?

Solución

Sobre la base de su descripción, parece que hay un directorio en el que el usuario no tiene acceso cuando se ejecuta con el UAC activado. No hay nada inherentemente malo con su código y el comportamiento en esa situación es por diseño. No hay nada que puede hacer en su código de moverse por el hecho de que su cuenta no tiene acceso a estos directorios en el contexto que se está ejecutando actualmente.

Lo que usted tiene que hacer es dar cuenta de directorio que no tiene acceso a. La mejor manera es probablemente mediante la adición de unos pocos métodos de extensión. Por ejemplo

public static FileInfo[] GetFilesSafe(this DirectoryRoot root, string path) {
  try {
    return root.GetFiles(path);
  } catch ( UnauthorizedAccessException ) {
    return new FileInfo[0];
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top