none
Acceso denegado a ciertas carpetas

    Pregunta

  • Hola amigos.

    Despues de un tiempo vuelvo por aqui en busca de ilumunacion pues estoy atascado en lo siguiente:

    Se trata de una pequeña aplicacion que usa un treeview y un listview para navegar por los directorios y subdirectorios de los discos del PC. 

    Funciona bien hasta que en el treeview selecciono ciertas carpetas que me lanza un mensaje de error "Acceso denegado a (la carpeta que intento abrir)"

    Son las carpetas "Archivos de programa" y otras. Supongo que tiene que ver con los privilegios y permisos, pero solo me lo hace desde dentro del entorno de desarrollo y no se como evitarlo.

    Espero vuestra ayuda

    Gracias


    sábado, 1 de octubre de 2016 19:16

Respuestas

  • "DiegC" escribió:

    > la ruta que intenta abrir es la correcta y no se ha colado ningun espacio ni
    > caracter raro. Para añadir aun mas confusion, fijate que el listado de C:\
    > de mi "file browser" (izquierda)  es diferente al que muestra el explorer de
    > windows (derecha) y otros gestores de  archivos que he probado. En el "mio"
    > la carpeta Archivos de programa no tiene la + y es como si estuviera vacia.
    > Es la que da error al intentar abrirla, pero si te fijas mas abajo hay una
    > carpeta que se llama Program files que si la abres no da ningun problema y
    > contiene los archivos y carpetas que deberian estar en Archivos de programa,
    > y aqui es cuando ya me refugio en el alcohol.

    Hola:

    Entiendo que el problema que estás teniendo radica en que estás intentando acceder a una carpeta llamada "C:\Archivos de programa" que NO EXISTE como tal en tu unidad C, ya que su nombre físico correcto es "C:\Program Files":

            Try
                ' Listar en un control ListBox los nombres de las carpetas existentes
                ' en la ruta especificada:
                '
                For Each dir As String In IO.Directory.GetDirectories("C:\Archivos de programa\")
                    ListBox1.Items.Add(dir)
                Next
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try

    Con esa ruta se obtendrá el siguiente mensaje de error, aunque la cuenta del usuario que ejecute la aplicación sea la cuenta Administrador u otra cualquiera perteneciente al grupo Administradores.

    En cambio, si especificas el nombre de la carpeta correcta:

        For Each dir As String In IO.Directory.GetDirectories("C:\Program Files\")

    entonces podrán listar las subcarpetas aquellas cuentas de usuario que sí tengan acceso a la carpeta especificada.

    ¿Por qué no se puede acceder a la carpeta "C:\Archivos de programa\"? Porque como he comentado antes, esa carpeta NO EXISTE como tal, ya que en realidad es una especie de vínculo o acceso directo, lo que se suele denominar un enlace simbólico, a una carpeta que sí existe, en éste caso, la famosa carpeta "C:\Program Files", los cuales se crean mediante el comando MKLINK /J, lo que hará que la carpeta tenga el atributo <JUNCTION>.

    Busca información en Internet sobre enlaces simbólicos o JUNCTION, como por ejemplo, el siguiente:

    Los enlaces duros, enlaces símbolicos y puntos de unión en Windows 7 / Windows Vista

    Si quieres verlo con tus propios ojos, abre una ventana del Símbolo del sistema y ejecuta el clásico comando DIR, con el obtendrás la lista de archivos y directorios (Imagen1), en éste caso los correspondientes a la unidad C. Observa que no aparece una subcarpeta llamada "C:\Archivos de programa", simplemente porque no existe, al menos no existe como aquellas que sí aparecen en la imagen.

    Pero si ahora ejecutas el comando DIR con la opción /a, podrás obtener los atributos de los archivos y directorios (Imagen2):

    Donde se indica que el atributo <JUNCTION> de la carpeta Archivos de programa es un enlace simbólico a la carpeta C:\Program Files, al igual que el correspondiente a la carpeta Documents and Settings es otro enlace simbólico a la carpeta C:\Users.

    > Para añadir aun mas confusion, fijate que el listado de C:\
    > de mi "file browser" (izquierda)  es diferente al que muestra
    > el explorer de windows (derecha) y otros gestores de  archivos
    > que he probado.

    Los listados son diferentes porque en la imagen de la derecha correspondiente a tu Explorador de Windows no tienes habilitado que se muestren los elementos ocultos. Si le indicas que se muestren, observarás que te aparecerán los mismos nombres de carpetas, no así los mismos iconos, ya que aquellas que tienen el atributo oculto tienen otro icono diferente, un poco más atenuado, de igual manera que las carpetas con un enlace simbólico (Archivos de programa, Document and Settings), aparece la típica flecha de enlace azul en el icono de la carpeta, lo que indica que esas carpetas son <JUNCTION>:

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    viernes, 7 de octubre de 2016 7:37
    Moderador
  • "DiegC" escribió:

    > no tenia ninguna posibilidad de saber que la carepeta "Archivos de programa" no existe,
    > porque estoy harto de verla en mi disco duro y de acceder a ella sin ningun problema.

    No voy a poner en duda que estarás harto de verla, pero eso de que accedes a ella sin ningún problema, no creo yo que sea así. ;-)

    El Explorador de archivos de tu sistema operativo te permite acceder a una carpeta llamada "Archivos de programa" porque una vez que hagas doble clic sobre ella, lo que hace internamente el Explorador, aparte de mostrar el nombre en el idioma local, es redirigirte a una carpeta llamada "Program Files", que es la carpeta que realmente existe en la unidad donde se encuentra instalado el sistema operativo, que normalmente es la unidad C:, y entiendo que se deberá a los motivos que expliqué en mi respuesta anterior.

    Te aparece la carpeta "Archivos de programa" porque seguramente tendrás una versión en español del sistema operativo Windows. Si tuvieras una versión en inglés, digo yo que solamente aparecería la carpeta "Program Files". Y si tuvieras una versión de Windows de chino mandarín o de algún idioma árabe, pues en su lugar aparecerá el correspondiente nombre traducido de la carpeta "Program Files", teniendo estos usuarios los mismos problemas que tenemos nosotros a la hora de acceder a dicha carpeta.

    Si al Explorador de archivos de tu sistema operativo le has indicado que te muestre los elementos ocultos, observarás que también obtienes un error cuando deseas acceder a las carpetas "Archivos de programa" o "Documents and Settings", aquellas que aparecen con una flecha azul en la esquina inferior izquierda del icono de la carpeta, porque si te detienes a analizar los atributos de dichas carpetas, observarás que tienen establecidos los siguientes atributos:

        Hidden Or System Or Directory Or ReparsePoint Or NotContentIndexed

    Es decir, es un Directorio, del Sistema, está Oculto, no se Indizará su contenido, y lo más importante, el atributo ReparsePoint, el cual indica que el archivo, éste caso la carpeta, contiene un punto de reanálisis, que significa que se trata de un bloque de datos definidos por el usuario asociado a un archivo o a un directorio (un enlace simbólico o JUNCTION).

    El significado de los diferentes atributos de los archivos y carpetas los puedes obtener en el siguiente enlace:

    FileAttributes (Enumeración)

    > PD. Debo decir que todo el codigo que he encontrado en internet (incluido el que
    > facilita Microsoft) no tiene en cuenta esto y al ejecutarlo da el error que
    > estamos tratando.

    Ignoro por completo qué código fuente es el que estás ejecutando, o aquel que indicas que "facilita Microsoft", pero me imagino que será algún ejemplo sencillo de MSDN que muestre cómo listar las carpetas contenidas en una unidad, por lo que no creo que el ejemplo tenga que entrar en los detalles sobre los que yo estoy entrando. También puede que de 50 libros dedicados al marco de trabajo de .NET que analicen el espacio de nombres System.IO, lo mismo tres o cuatro escriben sobre el problema que estás teniendo con la carpeta "Archivos de programa", lo que no quiere decir que los restantes cumplan correctamente con su objetivo inicial. Para ello, tendrías que haber buscado un ejemplo más completo, como el que te voy a exponer a continuación.

    Quiero pensar que deseas mostrar en tu aplicación una especie de Explorador de archivos para facilitarle la navegación a los usuarios de la misma. Si es así, entiendo que NO DEBERÍAS de mostrar aquellas carpetas que se encuentren marcadas con el atributo oculto, del sistema, o aquellas "problemáticas" (como puede ser el caso de las carpetas "Archivos de programa" y "Documents and Settings"), mayormente por motivos de seguridad (cosa que por cuestiones que considero obvias no voy a entrar en detalles) y para evitar el mayor número de posibles errores que se pueden producir por falta de permisos sobre una carpeta o archivo concreto.

    Por ejemplo, vamos a mostrar en un control ListBox el nombre de las carpetas pertenecientes a la unidad C:\ que no estén ocultas o marcadas con el atributo ReparsePoint. Para ello, en el evento Load del formulario de inicio de tu aplicación ejecutarías simplemente lo siguiente:

    Imports System.IO
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' Obtener un objeto DirectoryInfo correspondiente a la raíz de la unidad C:
            Dim di As New DirectoryInfo("C:\")
    
            ' Recorrer los directorios existentes en el objeto DirectoryInfo
            For Each d As DirectoryInfo In di.GetDirectories()
    
                ' Verificar si el directorio tiene el atributo ReparsePoint.
                Dim reparsePoint As Boolean = ((d.Attributes And FileAttributes.ReparsePoint) = FileAttributes.ReparsePoint)
    
                ' Verificar si el directorio tiene el atributo Hidden.
                Dim hidden As Boolean = ((d.Attributes And FileAttributes.Hidden) = FileAttributes.Hidden)
    
                If ((Not reparsePoint) AndAlso (Not hidden)) Then
                    ' Sólo mostrar aquellas carpetas que no estén marcadas
                    ' con el atributo ReparsePoint (punto de reanálisis) o
                    ' Hidden (oculto).
                    ListBox1.Items.Add(d.Name)
                End If
    
            Next
    
        End Sub
    
    End Class

    Y el resultado es el que muestra la siguiente imagen correspondiente a las carpetas existentes en mi unidad C:

    Hay muchas más carpetas, pero hemos evitado mostrar aquellas que están ocultas o marcadas con el atributo ReparsePoint, el cual requiere un análisis más completo para saber qué es lo que hay que hacer cuando alguien quiere entrar en las carpetas "Archivos de Programa" o "Documents and Settings". Como no sabemos qué análisis es el que hay que hacer, ¿para qué complicarnos la vida enseñándoselas al usuario?. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    viernes, 14 de octubre de 2016 16:49
    Moderador

Todas las respuestas

  • Si quieres puedes elevar los permisos del entorno de desarrollo. Cuando inicies Visual Studio, hazlo con el botón derecho sobre su icono y escogiendo la opción de "Ejecutar como Administrador". Si haces esto, entonces también se elevarán los privilegios del programa ejecutado dentro de ese entorno de desarrollo, y podrás acceder a las carpetas restringidas.

    Si realmente el programa debe poder acceder a esas carpetas, y por lo tanto siempre tiene que rodar con permisos elevados, añade al proyecto un Manifiesto de aplicación (es un tipo de Item que te ofrece Visual Studio) y dentro ponle la opción "requireAdministrator" (la verás en los comentarios dentro del manifiesto). Una vez hecho esto, el programa pedirá la elevación de privilegios cuando lo lances por sí solo, y Visual Studio la pedirá cuando lo lances en el entorno de desarrollo.

    sábado, 1 de octubre de 2016 20:22
  • Hola Alberto. Gracias por responder, sin embargo algo no debo hacer bien poque he probado lo que me indicaste y desde el entorno, cuando pruebo la aplicacion e intento expandir el nodo "Archivos de programas" (y otros) me sigue lanzando el error Acceso denegado a la ruta de acceso 'C:\Archivos de programa'. aunque otros directorios se abrencon normalidad y la verdad es que no tengo ni idea de como solucionarlo.

    Tambien he hecho lo que me indicaste y sustituí la linea del app.manisfest por esta otra

    <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />, pero aun asi sigue el error de los cojones.

    Copié textualmente codigo de un tutorial de Microsoft que se supone   debe funcionar y me dá el mismo error, lo que me hace pensar que es algo en la configuracion del ordenador o de Vs pero sigo sin dar con la solucion. Si salgo de VS puedo abrir todas las carpetas con normalidad. Algo de VS debe estar mal, pero que?

    ¿Alguna pista? ¿Alguna luz? Gracias de todas formas y hasta siempre

    Diego


    • Editado DiegC lunes, 3 de octubre de 2016 2:01
    lunes, 3 de octubre de 2016 1:57
  • Tal como lo tienes, se ejecuta con permisos de administrador, con lo cual no debería haber problemas para acceder a las carpetas, salvo que haya alguna que no tenga permisos para el Administrador, pero eso no debería pasar con la carpeta de Archivos de Programa.

    ¿Has examinado la línea exacta de programa donde te da el error? Pon un punto de ruptura con el debugger y examina los valores de las variables y la operación que estás realizando. A veces te llevas sorpresas, porque resulta que (por ejemplo) al haber espacios en blanco en "Archivos de programa" el código se hace un lío e intenta abrir una ruta imposible, o un directorio en lugar de un archivo, y por eso sale inesperadamente un error de "acceso denegado", que en realidad no es un acceso denegado sino una ruta incorrecta. No digo que te esté pasando exactamente eso, sino que puede ocurrir algo parecido y el código esté construyendo rutas incorrectas. 

    lunes, 3 de octubre de 2016 17:03
  • No Alberto, la ruta que intenta abrir es la correcta y no se ha colado ningun espacio ni caracter raro. Para añadir aun mas confusion, fijate que el listado de C:\ de mi "file browser" (izquierda)  es diferente al que muestra el explorer de windows (derecha) y otros gestores de  archivos que he probado. En el "mio" la carpeta Archivos de programa no tiene la + y es como si estuviera vacia. Es la que da error al intentar abrirla, pero si te fijas mas abajo hay una carpeta que se llama Program files que si la abres no da ningun problema y contiene los archivos y carpetas que deberian estar en Archivos de programa, y aqui es cuando ya me refugio en el alcohol.

    Lo chocante es que el codigo que dá este listado esta sacado de un tutorial de Microsoft.

    martes, 4 de octubre de 2016 15:25
  • "DiegC" escribió:

    > la ruta que intenta abrir es la correcta y no se ha colado ningun espacio ni
    > caracter raro. Para añadir aun mas confusion, fijate que el listado de C:\
    > de mi "file browser" (izquierda)  es diferente al que muestra el explorer de
    > windows (derecha) y otros gestores de  archivos que he probado. En el "mio"
    > la carpeta Archivos de programa no tiene la + y es como si estuviera vacia.
    > Es la que da error al intentar abrirla, pero si te fijas mas abajo hay una
    > carpeta que se llama Program files que si la abres no da ningun problema y
    > contiene los archivos y carpetas que deberian estar en Archivos de programa,
    > y aqui es cuando ya me refugio en el alcohol.

    Hola:

    Entiendo que el problema que estás teniendo radica en que estás intentando acceder a una carpeta llamada "C:\Archivos de programa" que NO EXISTE como tal en tu unidad C, ya que su nombre físico correcto es "C:\Program Files":

            Try
                ' Listar en un control ListBox los nombres de las carpetas existentes
                ' en la ruta especificada:
                '
                For Each dir As String In IO.Directory.GetDirectories("C:\Archivos de programa\")
                    ListBox1.Items.Add(dir)
                Next
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try

    Con esa ruta se obtendrá el siguiente mensaje de error, aunque la cuenta del usuario que ejecute la aplicación sea la cuenta Administrador u otra cualquiera perteneciente al grupo Administradores.

    En cambio, si especificas el nombre de la carpeta correcta:

        For Each dir As String In IO.Directory.GetDirectories("C:\Program Files\")

    entonces podrán listar las subcarpetas aquellas cuentas de usuario que sí tengan acceso a la carpeta especificada.

    ¿Por qué no se puede acceder a la carpeta "C:\Archivos de programa\"? Porque como he comentado antes, esa carpeta NO EXISTE como tal, ya que en realidad es una especie de vínculo o acceso directo, lo que se suele denominar un enlace simbólico, a una carpeta que sí existe, en éste caso, la famosa carpeta "C:\Program Files", los cuales se crean mediante el comando MKLINK /J, lo que hará que la carpeta tenga el atributo <JUNCTION>.

    Busca información en Internet sobre enlaces simbólicos o JUNCTION, como por ejemplo, el siguiente:

    Los enlaces duros, enlaces símbolicos y puntos de unión en Windows 7 / Windows Vista

    Si quieres verlo con tus propios ojos, abre una ventana del Símbolo del sistema y ejecuta el clásico comando DIR, con el obtendrás la lista de archivos y directorios (Imagen1), en éste caso los correspondientes a la unidad C. Observa que no aparece una subcarpeta llamada "C:\Archivos de programa", simplemente porque no existe, al menos no existe como aquellas que sí aparecen en la imagen.

    Pero si ahora ejecutas el comando DIR con la opción /a, podrás obtener los atributos de los archivos y directorios (Imagen2):

    Donde se indica que el atributo <JUNCTION> de la carpeta Archivos de programa es un enlace simbólico a la carpeta C:\Program Files, al igual que el correspondiente a la carpeta Documents and Settings es otro enlace simbólico a la carpeta C:\Users.

    > Para añadir aun mas confusion, fijate que el listado de C:\
    > de mi "file browser" (izquierda)  es diferente al que muestra
    > el explorer de windows (derecha) y otros gestores de  archivos
    > que he probado.

    Los listados son diferentes porque en la imagen de la derecha correspondiente a tu Explorador de Windows no tienes habilitado que se muestren los elementos ocultos. Si le indicas que se muestren, observarás que te aparecerán los mismos nombres de carpetas, no así los mismos iconos, ya que aquellas que tienen el atributo oculto tienen otro icono diferente, un poco más atenuado, de igual manera que las carpetas con un enlace simbólico (Archivos de programa, Document and Settings), aparece la típica flecha de enlace azul en el icono de la carpeta, lo que indica que esas carpetas son <JUNCTION>:

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    viernes, 7 de octubre de 2016 7:37
    Moderador

  • Perdon Don Enrique por tardar en atender su amable respuesta, pero vuelvo de unos dias de descanso que tenian prioridad alta.

    Mas que una respuesta ha sido un articulo, donde aclara perfectamente el comportamiento de mi "File Browser", pero yo, entiendalo, no tenia ninguna posibilidad de saber que la carepeta "Archivos de programa" no existe, porque estoy harto de verla en mi disco duro y de acceder a ella sin ningun problema. Otra cosa es que yo sepa adaptar toda esta informacion  a mis necesidades, pues el tema tiene tela.

    Seguiré investigando, probando y picoteando aqui y alla en este tortuoso camino que es el aprendizaje de VB.NET

    Gracias por haberse molestado en contestar con todo lujo de detalles. 

    Saludos 

    PD. Debo decir que todo el codigo que he encontrado en internet (incluido el que facilita Microsoft) no tiene en cuenta esto y al ejecutarlo da el error que estamos tratando.

    viernes, 14 de octubre de 2016 14:00
  • "DiegC" escribió:

    > no tenia ninguna posibilidad de saber que la carepeta "Archivos de programa" no existe,
    > porque estoy harto de verla en mi disco duro y de acceder a ella sin ningun problema.

    No voy a poner en duda que estarás harto de verla, pero eso de que accedes a ella sin ningún problema, no creo yo que sea así. ;-)

    El Explorador de archivos de tu sistema operativo te permite acceder a una carpeta llamada "Archivos de programa" porque una vez que hagas doble clic sobre ella, lo que hace internamente el Explorador, aparte de mostrar el nombre en el idioma local, es redirigirte a una carpeta llamada "Program Files", que es la carpeta que realmente existe en la unidad donde se encuentra instalado el sistema operativo, que normalmente es la unidad C:, y entiendo que se deberá a los motivos que expliqué en mi respuesta anterior.

    Te aparece la carpeta "Archivos de programa" porque seguramente tendrás una versión en español del sistema operativo Windows. Si tuvieras una versión en inglés, digo yo que solamente aparecería la carpeta "Program Files". Y si tuvieras una versión de Windows de chino mandarín o de algún idioma árabe, pues en su lugar aparecerá el correspondiente nombre traducido de la carpeta "Program Files", teniendo estos usuarios los mismos problemas que tenemos nosotros a la hora de acceder a dicha carpeta.

    Si al Explorador de archivos de tu sistema operativo le has indicado que te muestre los elementos ocultos, observarás que también obtienes un error cuando deseas acceder a las carpetas "Archivos de programa" o "Documents and Settings", aquellas que aparecen con una flecha azul en la esquina inferior izquierda del icono de la carpeta, porque si te detienes a analizar los atributos de dichas carpetas, observarás que tienen establecidos los siguientes atributos:

        Hidden Or System Or Directory Or ReparsePoint Or NotContentIndexed

    Es decir, es un Directorio, del Sistema, está Oculto, no se Indizará su contenido, y lo más importante, el atributo ReparsePoint, el cual indica que el archivo, éste caso la carpeta, contiene un punto de reanálisis, que significa que se trata de un bloque de datos definidos por el usuario asociado a un archivo o a un directorio (un enlace simbólico o JUNCTION).

    El significado de los diferentes atributos de los archivos y carpetas los puedes obtener en el siguiente enlace:

    FileAttributes (Enumeración)

    > PD. Debo decir que todo el codigo que he encontrado en internet (incluido el que
    > facilita Microsoft) no tiene en cuenta esto y al ejecutarlo da el error que
    > estamos tratando.

    Ignoro por completo qué código fuente es el que estás ejecutando, o aquel que indicas que "facilita Microsoft", pero me imagino que será algún ejemplo sencillo de MSDN que muestre cómo listar las carpetas contenidas en una unidad, por lo que no creo que el ejemplo tenga que entrar en los detalles sobre los que yo estoy entrando. También puede que de 50 libros dedicados al marco de trabajo de .NET que analicen el espacio de nombres System.IO, lo mismo tres o cuatro escriben sobre el problema que estás teniendo con la carpeta "Archivos de programa", lo que no quiere decir que los restantes cumplan correctamente con su objetivo inicial. Para ello, tendrías que haber buscado un ejemplo más completo, como el que te voy a exponer a continuación.

    Quiero pensar que deseas mostrar en tu aplicación una especie de Explorador de archivos para facilitarle la navegación a los usuarios de la misma. Si es así, entiendo que NO DEBERÍAS de mostrar aquellas carpetas que se encuentren marcadas con el atributo oculto, del sistema, o aquellas "problemáticas" (como puede ser el caso de las carpetas "Archivos de programa" y "Documents and Settings"), mayormente por motivos de seguridad (cosa que por cuestiones que considero obvias no voy a entrar en detalles) y para evitar el mayor número de posibles errores que se pueden producir por falta de permisos sobre una carpeta o archivo concreto.

    Por ejemplo, vamos a mostrar en un control ListBox el nombre de las carpetas pertenecientes a la unidad C:\ que no estén ocultas o marcadas con el atributo ReparsePoint. Para ello, en el evento Load del formulario de inicio de tu aplicación ejecutarías simplemente lo siguiente:

    Imports System.IO
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' Obtener un objeto DirectoryInfo correspondiente a la raíz de la unidad C:
            Dim di As New DirectoryInfo("C:\")
    
            ' Recorrer los directorios existentes en el objeto DirectoryInfo
            For Each d As DirectoryInfo In di.GetDirectories()
    
                ' Verificar si el directorio tiene el atributo ReparsePoint.
                Dim reparsePoint As Boolean = ((d.Attributes And FileAttributes.ReparsePoint) = FileAttributes.ReparsePoint)
    
                ' Verificar si el directorio tiene el atributo Hidden.
                Dim hidden As Boolean = ((d.Attributes And FileAttributes.Hidden) = FileAttributes.Hidden)
    
                If ((Not reparsePoint) AndAlso (Not hidden)) Then
                    ' Sólo mostrar aquellas carpetas que no estén marcadas
                    ' con el atributo ReparsePoint (punto de reanálisis) o
                    ' Hidden (oculto).
                    ListBox1.Items.Add(d.Name)
                End If
    
            Next
    
        End Sub
    
    End Class

    Y el resultado es el que muestra la siguiente imagen correspondiente a las carpetas existentes en mi unidad C:

    Hay muchas más carpetas, pero hemos evitado mostrar aquellas que están ocultas o marcadas con el atributo ReparsePoint, el cual requiere un análisis más completo para saber qué es lo que hay que hacer cuando alguien quiere entrar en las carpetas "Archivos de Programa" o "Documents and Settings". Como no sabemos qué análisis es el que hay que hacer, ¿para qué complicarnos la vida enseñándoselas al usuario?. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    viernes, 14 de octubre de 2016 16:49
    Moderador
  • Perfectamente aclarado el tema. 

    He buscado y probado infinidad de ejemplos que he encontrado por la red, pero no he encontrado ni uno que dé el listado como el que nos has facilitado en el ejemplo. De hecho, y con tu permiso, es el quer voy a incorporar en mi pequeña aplicacion porque da solucion al problema por el que acudi al foro.

    El codigo que "facilita Microsoft"es Ejemplo Treeview

    En cuanto cambias el directorio a C:\ y llega a la carpeta Archivos de programa salta el error

    Gracias de nuevo, a ti y a todos los que regalan su tiempo y saber en este foro.

    sábado, 15 de octubre de 2016 18:30