none
UnauthorizedAccessException RRS feed

  • Pregunta

  • Hola.

    Tengo el sguiente problema:

    Al intentar obtener en un ListBox todos los archivos TXT de la unidad C:\ , donde esta instalado el Sistema Operativo Windows Vista, con el codigo,

            Try
                Dim myCoolFolder As String = "C:\"
                For Each myCoolFile As String In My.Computer.FileSystem.GetFiles _
                         (myCoolFolder, FileIO.SearchOption.SearchAllSubDirectories, "*.txt")
                    ListBox1.Items.Add(IO.Path.GetFileName(myCoolFile))
                Next
            Catch ex As UnauthorizedAccessException
                TextBox1.Text = ex.Message
            End Try
    
    

    Me aparece el mensaje: Acceso denegado a la ruta de acceso 'C:\Archivos de programa\'.

    Me pueden ayudar a solucionar este problema para poder obtener los nombres de los citados archivos?

    Muchas gracias.

     


    Rafael FM
    miércoles, 12 de octubre de 2011 8:56

Respuestas

  • "Rafael FM" escribió:

    > Si manualmente doy permisos a la Carpeta CSC, siempre hay
    > otra carpeta que ocurre lo mísmo.

    ¡Una no! ¡MIL CARPETAS, por lo menos! :-))

    > estoy pensando hacer lo que quiero con shell:
    >
    > Shell("cmd /c cd C:\ & C: & dir /b *.txt /s & pause")
    >
    > pero no se como hacer para que se muestren los archivos en el ListBox

    Ahora que has comentado el clásico comando 'Dir' de DOS, me viene a la mente que puedes crear un archivo de texto con el modificador >, donde se guardarán todos los archivos devueltos por el comando 'Dir'.

    Para hacer una prueba, abre una ventana DOS, te diriges a la raíz de la unidad C, y ejecuta:

    dir /b *.txt /s > C:\Temp\Archivos.txt

    En lugar de especificar la carpeta Temp (me gusta tener una carpeta Temp en la unidad C para hacer pruebas con archivos), especifica la que creas conveniente.

    Ahora desde tu aplicación de Visual Basic, simplemente tienes que leer el archivo de texto para añadir los archivos (registros) al control ListBox:

            Try
                Dim connectionString As String = _
                    "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                    "Data Source = C:\Temp;" & _
                    "Extended Properties='TEXT;HDR=No'"
    
                Using cnn As New OleDbConnection(connectionString)
    
                    Dim cmd As OleDbCommand = cnn.CreateCommand
                    cmd.CommandText = "SELECT * FROM Archivos#txt"
    
                    Dim da As New OleDbDataAdapter(cmd)
    
                    Dim dt As New DataTable("Archivos")
    
                    da.Fill(dt)
    
                    With ListBox1
                        .DataSource = dt
                        .DisplayMember = "F1"
                        .ValueMember = "F1"
                    End With
    
                End Using
    
                ' Eliminamos el archivo
                IO.File.Delete("C:\Temp\Archivos.txt")
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    

    Como la primera fila del archivo de texto no contiene el nombre de los campos (HDR=No), el único campo existente en el archivo 'Archivos.txt' se llamará 'F1'.

    Mira a ver si así puedes listar los archivos. Desde luego, una solución mucho más factible que la que estás intentando utilizar. :-)

     


     


    Enrique Martínez
      [MS MVP - VB]

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

    • Propuesto como respuesta Pedro Hurtado miércoles, 12 de octubre de 2011 15:24
    • Marcado como respuesta Rafael FM miércoles, 12 de octubre de 2011 15:42
    miércoles, 12 de octubre de 2011 15:21
    Moderador

Todas las respuestas

  • Hola Rafael,

    Mira este link DirectorySecurity, pero la verdad que imagino que problemas tendrás y no pocos, estás leyendo todos los subdirectorios de la unidad c, esto es realmente necesario ?

    Saludos,


    phurtado
    miércoles, 12 de octubre de 2011 9:10
  • Muchas gracias Pedro Hurtado.

    A tu pregunta, la respuesta es si. Porque necesito eliminar archivos innecesarios con cierta extension e ir mostrandolos mientras tanto.

    Se que no es demasiado util. Con solo eliminarlos de todo el disco seria suficiente. Pero es mejor saber lo que se esta haciendo.

     

    Todavia no he mirado el link que me ofreces pero ahora mismo le echo un vistazo.

    Gracias nuevamente.

     

     


    Rafael FM
    miércoles, 12 de octubre de 2011 9:19
  • "Rafael FM" escribió:

    > Tengo el sguiente problema:
    >
    > Al intentar obtener en un ListBox todos los archivos TXT de la unidad C:\,
    > donde esta instalado el Sistema Operativo Windows Vista, con el codigo,
    >
    > For Each myCoolFile As String In My.Computer.FileSystem.GetFiles _
    >  (myCoolFolder, FileIO.SearchOption.SearchAllSubDirectories, "*.txt")
    >
    > Me aparece el mensaje: Acceso denegado a la ruta de acceso
    > 'C:\Archivos de programa\'.
    >
    > Me pueden ayudar a solucionar este problema para poder obtener
    > los nombres de los citados archivos?

    Rafael, si el usuario no tiene los permisos necesarios, no puede listar los archivos contenidos en aquellas carpetas donde no tenga permiso. Pero el problema no solamente te aparecerá en la carpeta 'C:\Archivos de programa', si no que lo hará en muchísimas otras carpetas que hasta la cuenta Administrador no tiene permisos.

    Son carpetas protegidas por el propio sistema operativo que cualquiera no puede leerlas y hacer en ellas lo que le venga en gana. Imagina quá seguridad tendría el sistema operativo, si cualquier usuario accede a una carpeta protegida y elimina los archivos contenidos en ella. :-D

    Para salir del paso, lo único que puedes hacer es detectar la excepción y continuar con el bucle, tal y como te muestro a continuación:

            Dim myCoolFolder As String = "C:\"
    
            Dim folders() As String = _
                IO.Directory.GetDirectories(myCoolFolder, "*.*", IO.SearchOption.TopDirectoryOnly)
    
            For Each folder As String In folders
    
                Try
                    Dim files() As String = _
                        IO.Directory.GetFiles(folder, "*.txt", IO.SearchOption.AllDirectories)
    
                    For Each file As String In files
                        ListBox1.Items.Add(IO.Path.GetFullPath(file))
                    Next
    
                Catch ex As Exception
                    ' sin implementación
    
                End Try
    
            Next
    

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

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

    miércoles, 12 de octubre de 2011 9:26
    Moderador
  • Muchas gracias SoftJaen. Pero sigue apareciendo el error. Porque me interesa obtener los archivos en toda la unidad C: y no solo los de estan ocultos.

    He cambiado:

    IO.Directory.GetFiles(folder, "*.txt", IO.SearchOption.TopDirectoryOnly)

    'por:   

    IO.Directory.GetFiles(folder, "*.txt", IO.SearchOption.AllDirectories)

    Y el resultado es el que ya se ha mencionado.

     

    Att:


    Rafael FM

    • Editado Rafael FM miércoles, 12 de octubre de 2011 10:08
    miércoles, 12 de octubre de 2011 10:05
  • "Rafael FM" escribió:

    > Muchas gracias SoftJaen. Pero sigue apareciendo el error.
    > Porque me interesa obtener los archivos en toda la unidad C:
    > y no solo los de estan ocultos.

    Me extraña que te aparezca un error porque el bloque 'Catch' está en blanco:

         Catch ex As Exception
           ' sin implementación

    Te vuelvo a repetir que la excepción siempre se producirá si la cuenta del usuario no tiene permiso para acceder a la carpeta, pero el bucle continúa su ejecución, leyendo otros archivos a los que sí tiene acceso el usuario.

    > IO.Directory.GetFiles(folder, "*.txt", IO.SearchOption.AllDirectories)

    Al inicio de todo el proceso no puedes indicar la opción 'AllDirectories' porque vas a obtener la excepción que estás obteniendo. Aparte que no creo que haya archivo *.txt del usuario en aquellas carpetas donde no tienes permiso, porque al igual que no puedes acceder a ella, tampoco tienes permiso para guardar archivos.

    Tienes que especificar la opción 'TopDirectoryOnly', y posteriormente sí puedes especificar la opción 'AllDirectories' para recorrer las subcarpetas de cada carpeta.

    Primero ejecuta el ejemplo, tal cual te lo he indicado, y observa el resultado.

     

     


    Enrique Martínez
      [MS MVP - VB]

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


    miércoles, 12 de octubre de 2011 10:21
    Moderador
  • SoftJaen.

    Solo me aparecen los archivos txt que hay en la papelera de reciclaje.

    Me parece que se necesita "SearchAllSubDirectories" pero todavia no se como.

    Att:

     

     


    • Editado Rafael FM miércoles, 12 de octubre de 2011 11:21
    miércoles, 12 de octubre de 2011 11:19
  • "Rafael FM" escribió:

    > Solo me aparecen los archivos txt que hay en la papelera de reciclaje.
    >

    A mí me aparecen todos los archivos txt que tengo desperdigados por las distintas carpetas y subcarpetas de la unidad C de mi PC.

    Rafael, ¿seguro que estás ejecutando el código tal cual te lo he indicado que lo hagas, SIN NINGUNA MODIFICACIÓN, salvo el nombre del control ListBox?

    Por favor, ejecuta el código tal cual está, y cuando veas que funciona, haces las modificaciones que creas oportuno. ¿De acuerdo?


    Enrique Martínez
      [MS MVP - VB]

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

    miércoles, 12 de octubre de 2011 11:44
    Moderador
  • He puesto el codigo tal y como lo has publicado en una declaracion Button1.Click y solo aparecen los txt que hay en la carpeta Recycler

    y abriendo la papelera no se ven estos archivos txt parece que estan ocultos.

    Att:


    Rafael FM
    miércoles, 12 de octubre de 2011 12:06
  • Pues lo siento muchísimo, pero a mí no me sucede eso.

     


    Enrique Martínez
      [MS MVP - VB]

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

    miércoles, 12 de octubre de 2011 13:21
    Moderador
  • he probado co la unidad D:\ y, sí funciona. Pero no con la que tiene el SO.

    Implementando Catch ex As Exception sale: Acceso denegado a la ruta de acceso 'C:\Windows\CSC\'.

     

    Se agradece de todas formas.

    Att:

       


    Rafael FM
    miércoles, 12 de octubre de 2011 14:20
  • "Rafael FM" escribió:

    > he probado co la unidad D:\ y, sí funciona.
    > Pero no con la que tiene el SO.
    >
    > Implementando Catch ex As Exception sale:
    > Acceso denegado a la ruta de acceso 'C:\Windows\CSC\'.

    Nuevamente insisto que no es problema del código fuente; el ejemplo que te he indicado funciona correctamente.

    El "problema" (si se le pueda llamar "problema"), es del sistema operativo, que no te permite tener acceso a ciertas carpetas simplemente porque están protegidas, cuestión que yo veo normal que así suceda, porque de no ser así, se pondría en tela de juicio toda la seguridad del sistema de archivos del propio sistema operativo.

    Yo tampoco tengo acceso a C:\Windows\CSC, y no se me va a ocurrir grabar un archivo *.txt, *.jpg, o *.pdf en dicha carpeta, porque a la hora de hacerlo, tendré el correspondiente error desde el sistema operativo, porque la cuenta del usuario no tiene permisos para acceder a dicha carpeta. Y no es cuestión de ir dando permisos a carpetas que están PROTEGIDAS por el sistema operativo. A mi entender, eso NO ES UNA SOLUCIÓN, más bien es DESPROTEGER EL SISTEMA OPERATIVO.

    Tal y como te indiqué en un principio, al querer recorrer toda la estructura de carpetas de una unidad en concreto, no te va a quedar más remedio que atrapar la excepción y continuar con el bucle para listar los archivos con extensión *.txt que se encuentren en carpetas que el usuario sí tiene permisos para leerlas. No veo yo otra solución que no pase por asignar permisos a diestro y siniestro para que todos los usuarios que utilicen nuestra aplicación, accedan a todas las carpetas del sistema operativo.

    ¡Hasta la cuenta del usuario 'Administrador' no es capaz de leer el contenido de ciertas carpetas del sistema operativo! :-)

     


    Enrique Martínez
      [MS MVP - VB]

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

    miércoles, 12 de octubre de 2011 14:50
    Moderador
  • Si manualmente doy permisos a la Carpeta CSC, siempre hay otra carpeta que ocurre lo mísmo.

    estoy pensando hacer lo que quiero con shell:

    Shell("cmd /c cd C:\ & C: & dir /b *.txt /s & pause")

    pero no se como hacer para que se muestren los archivos en el ListBox

     

    Alguna idea?


    Rafael FM
    miércoles, 12 de octubre de 2011 14:51
  • Hola Rafael,

    Yo creo Enrique que lo más inteligente por parte nuestra es comentar claro y conciso lo siguiente.

    En este momento te aparece la carpeta X, después casi seguro vendrá la Y y al final de todos los tiempos la Z que nadie conoce su nombre. Te invito a que te asocies, ojo en el buen sentido de la palabra, con este usuario del foro de c# ll2121 y cuando ambos terminéis el windows 9 nos lo comentáis. Estáis intentando hacer algo complicado, que posiblemente no se resuelva ni con vb ni con c#, porque no empezáis con c++.

     

    Saludos,


    phurtado
    miércoles, 12 de octubre de 2011 15:14
  • "Rafael FM" escribió:

    > Si manualmente doy permisos a la Carpeta CSC, siempre hay
    > otra carpeta que ocurre lo mísmo.

    ¡Una no! ¡MIL CARPETAS, por lo menos! :-))

    > estoy pensando hacer lo que quiero con shell:
    >
    > Shell("cmd /c cd C:\ & C: & dir /b *.txt /s & pause")
    >
    > pero no se como hacer para que se muestren los archivos en el ListBox

    Ahora que has comentado el clásico comando 'Dir' de DOS, me viene a la mente que puedes crear un archivo de texto con el modificador >, donde se guardarán todos los archivos devueltos por el comando 'Dir'.

    Para hacer una prueba, abre una ventana DOS, te diriges a la raíz de la unidad C, y ejecuta:

    dir /b *.txt /s > C:\Temp\Archivos.txt

    En lugar de especificar la carpeta Temp (me gusta tener una carpeta Temp en la unidad C para hacer pruebas con archivos), especifica la que creas conveniente.

    Ahora desde tu aplicación de Visual Basic, simplemente tienes que leer el archivo de texto para añadir los archivos (registros) al control ListBox:

            Try
                Dim connectionString As String = _
                    "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                    "Data Source = C:\Temp;" & _
                    "Extended Properties='TEXT;HDR=No'"
    
                Using cnn As New OleDbConnection(connectionString)
    
                    Dim cmd As OleDbCommand = cnn.CreateCommand
                    cmd.CommandText = "SELECT * FROM Archivos#txt"
    
                    Dim da As New OleDbDataAdapter(cmd)
    
                    Dim dt As New DataTable("Archivos")
    
                    da.Fill(dt)
    
                    With ListBox1
                        .DataSource = dt
                        .DisplayMember = "F1"
                        .ValueMember = "F1"
                    End With
    
                End Using
    
                ' Eliminamos el archivo
                IO.File.Delete("C:\Temp\Archivos.txt")
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    

    Como la primera fila del archivo de texto no contiene el nombre de los campos (HDR=No), el único campo existente en el archivo 'Archivos.txt' se llamará 'F1'.

    Mira a ver si así puedes listar los archivos. Desde luego, una solución mucho más factible que la que estás intentando utilizar. :-)

     


     


    Enrique Martínez
      [MS MVP - VB]

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

    • Propuesto como respuesta Pedro Hurtado miércoles, 12 de octubre de 2011 15:24
    • Marcado como respuesta Rafael FM miércoles, 12 de octubre de 2011 15:42
    miércoles, 12 de octubre de 2011 15:21
    Moderador
  • Je! Gracias Pedro Hurtado.

    Ya pense en C++ pero me parece dificil dejar el VB sin conocer, por lo menos, las cosas mas basicas.

     

    Bueno. Sobre este hilo decir que al final lo consegui. No es muy sutil pero sigue siendo valido por si no se encuentra algo mejor.

     

    Aqui dejo el codigo por si a alguien le pueda interesar.

     

        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Shell("cmd /c cd C:\ & C: & dir /b *.txt /s >%userprofile%\desktop\txt.txt")
            Dim path As String = "C:\Users\Usuario\Desktop\"
            Dim a As String = My.Computer.FileSystem.ReadAllText(path & "txt.txt")
            Dim b As String() = a.Split(vbNewLine)
            ListBox1.Items.AddRange(b)
        End Sub
    

     

    Muchas gracias.

    Att:


    Rafael FM
    • Editado Rafael FM miércoles, 12 de octubre de 2011 15:26
    miércoles, 12 de octubre de 2011 15:25
  • Hola Rafael,

    La verdad que me lo has puesto a huevo :) como dicen en mi pueblo no es lo mismo hacer "dir  / b *.txt" de c:\Users\XXXXXXX\DeskTop\ que de c:\, prueba con esto sin elevar permisos y nos cuentas si no te aparece esto.

    Es que cambia mucho tu planteamiento no es lo mismo "c:\" que leer los archivos txt de tu escritorio "c:\Users\XXXXXXX\DeskTop\", la verdad es que es un placer aprender las cosas básicas de vb antes de pasarme a c++ :)

    La verdad que creo que es más fácil hacer esto y pulsar intro.

    La verdad que propuse la respuesta de Enrique por su audacia, pero mira por donde que nunca lo hago hoy me voy a proponer yo.

    Saludos,


    phurtado
    • Propuesto como respuesta Pedro Hurtado miércoles, 12 de octubre de 2011 15:41
    • Editado Enrique M. MontejoModerator miércoles, 12 de octubre de 2011 17:58 Eliminar el nombre de la cuenta del usuario
    miércoles, 12 de octubre de 2011 15:40
  • Gracias SoftJaen.

    Att:


    Rafael FM
    miércoles, 12 de octubre de 2011 15:42
  • "Rafael FM" escribió:

    > Sobre este hilo decir que al final lo consegui. No es muy sutil
    > pero sigue siendo valido por si no se encuentra algo mejor.

    Y ¿por qué no va a ser "sutil"? Si funciona y hace bien su trabajo, será válido. :-)

     


    Enrique Martínez
      [MS MVP - VB]

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


    miércoles, 12 de octubre de 2011 15:43
    Moderador
  • Hola Enrique,

    Valido sobre "c:\Users\XXXXXX\DeskTop\" y no valido sino inteligente, pero ese no es el origen el origen era "c:\" y tanto tú como yo hemos advertido de lo que le podía pasar, tu con ejemplos y yo con filosofía, pero eso que intentaba era una tarea difícil, ahora que no nos venga con ""c:\Users\XXXXXX\DeskTop\" sino que ejecute su código sobre "c:\" y cuando podamos tomar un café los tres que nos lo cuente :)

    Saludos,


    phurtado

    miércoles, 12 de octubre de 2011 15:50
  • "Pedro Hurtado" escribió:

    > La verdad que me lo has puesto a huevo :) como dicen en mi
    > pueblo no es lo mismo hacer "dir  / b *.txt" de
    > c:\Users\XXXXXXX\DeskTop\ que de c:\, prueba con esto sin
    > elevar permisos y nos cuentas si no te aparece esto.

    Hola, Pedro:

    Si desde una ventana DOS que se encuentra en la unidad raiz del sistema operativo (en el 90 por 100 de los casos la unidad C), ejecutas

       C:\>dir /b *.txt > archivos.txt

    es normal que obtengas el error

       Acceso denegado

    porque seguramente tu cuenta de usuario no tiene permisos para crear un archivo llamado 'Archivos.txt' en la raíz de la unidad C:. ¡Así de sencillo!

    En lugar de crear el archivo en la raíz, créalo en una subcarpeta de la unidad C:

       C:\>dir /b *.txt > C:\Temp\archivos.txt

    Siempre suelo escribir que no es aconsejable crear archivos en la raíz de la unidad que almacena el sistema operativo. No te puedes hacer una idea cuántos problemas de los que se plantean aquí a diario, tienen su origen porque al usuario no se le ha ocurrido mejor idea que guardar la base de datos, o cualquier archivo, en C:. ¡Muchísimos problemas! :-)

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

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


    miércoles, 12 de octubre de 2011 15:53
    Moderador
  • "Pedro Hurtado" escribió:

    > que ejecute su código sobre "c:\" y cuando podamos tomar
    > un café los tres que nos lo cuente :)

    Lee mi mensaje a una respuesta tuya anterior. La que aparece la imagen con el error 'Acceso denegado'. :-)

     

     


    Enrique Martínez
      [MS MVP - VB]

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

    miércoles, 12 de octubre de 2011 15:57
    Moderador
  • Pedro.

    ...Lo que trato de hacer es un programa que elimine todos los archivos innecesarios de, o de cualquier equipo, con varias opciones más. Y solo dandole a un boton. También ir mostrando lo que se va eliminando.

    Se que hay muchos programas que lo hacen y mejor pero tambien se puede decir; ¡Ay! Este programa podria llevas esto mas o lo otro y me tendria que aguantar. Por eso, hay veces que prefiero programar uno malo que haga lo que quiero y como quiero y poderlo cambiar si encuentro algo mejor.

     

    (Aqui me encuentro con un problema que tendre que investigar. El Framework 4. Que no deja instalar programas creados con esta actualizacion en equipos con una inferior.)

     

    Gracias de nuevo.

    Siempre se aprende algo nuevo!

    Att:


    Rafael FM
    miércoles, 12 de octubre de 2011 16:01
  • "Pedro Hurtado" escribió:

    > que ejecute su código sobre "c:\" y cuando podamos tomar
    > un café los tres que nos lo cuente :)

    Lee mi mensaje a una respuesta tuya anterior. La que aparece la imagen con el error 'Acceso denegado'. :-)

     

     


    Enrique Martínez
      [MS MVP - VB]

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

    Hola Enrique,

    Efectivamente Enrique no tengo permisos de escritura y por eso apunte a elevar permisos y lo mismo tampoco para crear una carpeta que se acomode a las necesidades para poder hacer "dir /b *.txt > C:\Temp\archivos.txt", por eso me molestan este tipo de soluciones, porque hoy si y mañana no, no depende de nosotros sino de terceras personas y eso desde mi punto de vista no es buena solución :)

     

    Saludos,


    phurtado
    miércoles, 12 de octubre de 2011 16:06
  • Hola Rafael,

    La verdad que me lo has puesto a huevo :) como dicen en mi pueblo no es lo mismo hacer "dir  / b *.txt" de c:\Users\XXXXXXX\DeskTop\ que de c:\, prueba con esto sin elevar permisos y nos cuentas si no te aparece esto.

    Es que cambia mucho tu planteamiento no es lo mismo "c:\" que leer los archivos txt de tu escritorio "c:\Users\XXXXXX\DeskTop\", la verdad es que es un placer aprender las cosas básicas de vb antes de pasarme a c++ :)

    La verdad que creo que es más fácil hacer esto y pulsar intro.

    La verdad que propuse la respuesta de Enrique por su audacia, pero mira por donde que nunca lo hago hoy me voy a proponer yo.

    Saludos,


    phurtado


    Una cosilla Pedro.

    Que rapido fuiste en ver el mensaje con mi nombre de cuenta de Windows. Porque al momento de darle yo al boton enviar lo vi y, enseguida lo edite para cambiarlo.

    Sea cos de anonimato. !Je¡


    miércoles, 12 de octubre de 2011 16:07
  • Pedro.

    ...Lo que trato de hacer es un programa que elimine todos los archivos innecesarios de, o de cualquier equipo, con varias opciones más. Y solo dandole a un boton. También ir mostrando lo que se va eliminando.

    Se que hay muchos programas que lo hacen y mejor pero tambien se puede decir; ¡Ay! Este programa podria llevas esto mas o lo otro y me tendria que aguantar. Por eso, hay veces que prefiero programar uno malo que haga lo que quiero y como quiero y poderlo cambiar si encuentro algo mejor.

     

    (Aqui me encuentro con un problema que tendre que investigar. El Framework 4. Que no deja instalar programas creados con esta actualizacion en equipos con una inferior.)

     

    Gracias de nuevo.

    Siempre se aprende algo nuevo!

    Att:


    Rafael FM

    Hola Rafael,

    Una cosa que puedas hacer dir y otra muy distinta es que despúes puedas eliminar el archivo :)

    Saludos,


    phurtado
    miércoles, 12 de octubre de 2011 16:08
  • "Pedro Hurtado" escribió:

    > Efectivamente Enrique no tengo permisos de escritura y por eso
    > apunte a elevar permisos y lo mismo tampoco para crear una
    > carpeta que se acomode a las necesidades para poder hacer
    > "dir /b *.txt > C:\Temp\archivos.txt", por eso me molestan este
    > tipo de soluciones, porque hoy si y mañana no, no depende de
    > nosotros sino de terceras personas y eso desde mi punto de
    > vista no es buena solución :)

    No sé. Lo mismo no me he sabido explicar, que será lo más seguro. :-(

    Si tú obtienes el error 'Acceso denegado', no es porque quieras listar los archivos con extensión *.txt; lo obtienes porque estás queriendo CREAR UN ARCHIVO en la raíz de la unidad que contiene el sistema operativo.

    Y para no tener problemas con los permisos para crear una carpeta, siempre podremos indicar que el archivo 'Archivos.txt' (listado generado por el comando DIR), se cree en la carpeta que contenga nuestra aplicación, o en la carpeta de archivos temporales del usuario.

     


    Enrique Martínez
      [MS MVP - VB]

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

    miércoles, 12 de octubre de 2011 16:12
    Moderador
  • Hola Rafael,

    La verdad que me lo has puesto a huevo :) como dicen en mi pueblo no es lo mismo hacer "dir  / b *.txt" de c:\Users\XXXXXX\DeskTop\ que de c:\, prueba con esto sin elevar permisos y nos cuentas si no te aparece esto.

    Es que cambia mucho tu planteamiento no es lo mismo "c:\" que leer los archivos txt de tu escritorio "c:\Users\XXXXXX\DeskTop\", la verdad es que es un placer aprender las cosas básicas de vb antes de pasarme a c++ :)

    La verdad que creo que es más fácil hacer esto y pulsar intro.

    La verdad que propuse la respuesta de Enrique por su audacia, pero mira por donde que nunca lo hago hoy me voy a proponer yo.

    Saludos,


    phurtado


    Una cosilla Pedro.

    Que rapido fuiste en ver el mensaje con mi nombre de cuenta de Windows. Porque al momento de darle yo al boton enviar lo vi y, enseguida lo edite para cambiarlo.

    Att:

     


    Rafael FM

    Hola Rafa,

    Muchas preguntas leidas y fijarte en los más pequemos detalles, piensa en otro camino :)

    Saludos,


    phurtado
    miércoles, 12 de octubre de 2011 16:14
  • "Rafael FM" escribió:

    > (Aqui me encuentro con un problema que tendre que investigar.
    > El Framework 4. Que no deja instalar programas creados con
    > esta actualizacion en equipos con una inferior.)

    Mejor será que para éste problema inicies una nueva conversación, porque ésta ya se está haciendo bastante larga para poder leerla medio en condiciones. ;-)

    No obstante, te comento que esos equipos deberán tener instalada la versión 4.0 del marco de trabajo de .net, si la aplicación que deseas ejecutar en ellos se compiló con dicha versión.

     


    Enrique Martínez
      [MS MVP - VB]

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


    miércoles, 12 de octubre de 2011 16:17
    Moderador
  • Hola Enrique,

    La verdad es que tienes toda la razón del mundo y te has explicado de maravilla, es más gracias por enseñar :) , pero me encantaría que me contestases a esto

    Porque necesito eliminar archivos innecesarios con cierta extension e ir mostrandolos mientras tanto.

    Saludos,


    phurtado
    miércoles, 12 de octubre de 2011 16:21
  • Bueno. Yo puedo leer y escribir en la raiz de la unidad del SO con:

    dir c: /s>C:\dir.txt, por ejemplo. (Teclas "Control + C" para abortar.)

    Una cosa. He abierto el programa DOS con permisos de propietario antes.

     

    Att:


    Rafael FM
    miércoles, 12 de octubre de 2011 16:25
  • Te puedo contestar yo Pedro?

    Bueno lo hare de todos modos.

    El programa que estoy creando no es sino para mi. Y como no se mucho de informatica todavia, y quiero hacer varias cosas con los archivos que se van mostrando. Aparte de consumir un poco mas de recursos, te dire que es por simple curiosidad o apetencia como se quiera llamar. Tambien para ir echando un vistazo, despues, a lo que se ha eliminado , etc.

    Att:

     

     


    Rafael FM
    • Editado Rafael FM miércoles, 12 de octubre de 2011 16:36
    miércoles, 12 de octubre de 2011 16:32
  • Gracias SoftJaen.

    No es para comenzar otro tema, solo lo decia como una observacion.


    Rafael FM
    miércoles, 12 de octubre de 2011 16:34
  • Hola Rafa,

    Contestar y opinar siempre, creo que no hay nada ni nadie que te lo impida :), pero por lo único que he luchado desde el principio, es porque te queden claros los problemas a los que te enfrentas, si te apetece no te cortes, adelante :)

    Saludos,


    phurtado
    miércoles, 12 de octubre de 2011 16:37

  • "Pedro Hurtado" me preguntó:

    > me encantaría que me contestases a esto
    >
    > Porque necesito eliminar archivos innecesarios con cierta
    > extension e ir mostrandolos mientras tanto.

    ¿Me preguntas porqué lo necesitas? Pues no lo sé. Tu sabrás el motivo. :-D

    Pero por lo que yo he entendido de ésta conversación, parece ser que Rafael primero quiere LISTAR y después ELIMINAR. Es decir, ¿qué archivos tengo con extensión *.txt? Para ello lo listo. Ahora, no me interesa éste, aquel, éste otro, el de más alla y éste que no tengo ni idea lo que hace aquí. Y los elimina.

    Me parece una cosa lógica.

    Pero si los eliminamos primero, no sé yo si se van a poder listar. :-)


    Enrique Martínez
      [MS MVP - VB]

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

    miércoles, 12 de octubre de 2011 16:38
    Moderador
  • "Rafael FM" escribió:

    > Bueno. Yo puedo leer y escribir en la raiz de la unidad del SO con:
    >
    > Una cosa. He abierto el programa DOS con permisos de propietario antes.

    ¡Claro! Si el "propietario" tiene permisos para crear archivos en la raíz de C:, pues no tienes problema alguno.

    Si yo ejecuto el 'Símbolo del sistema' con la cuenta 'Administrador', tampoco tengo problemas para crear un archivo en la raíz de C:

    Si quieres un consejo, no se te ocurra crear archivos en la raíz de la unidad del sistema operativo, porque no todos los usuarios son Administradores. :-)


    Enrique Martínez
      [MS MVP - VB]

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

    miércoles, 12 de octubre de 2011 16:42
    Moderador
  • Hola Enrique,

    Te pregunto porque así lo expreso Rafael, que quería ELIMINAR despues de LISTAR tal como tu dices y la verdad que sería muy constructivo ver como se pueden eliminar los archivos "*.txt " que obtenga después de ejecutar esta instruccion "dir c:\*.* /s> c:\temp\archivos.txt sin elevar permisos, esa es la pregunta, lo mismo es que me he perdido algo por el camino y hay algún truco que nos permita hacer eso :)

    Enrique problemas todos los días, hoy mañana y hasta que descubra a "Z": ).

    Yo nunca he obviado que primero se tienen que LISTAR para despues ELIMINAR.

    Pero sigo sin respuesta :)

    Saludos,

     


    phurtado
    miércoles, 12 de octubre de 2011 16:55
  • Hola Enrique,

    Perdona pero se me olvido esto.

    Que hay que hacer otro programa para leer el resultado de "dir c:\*.txt /s > c:\temp\archivos.txt", porque la pinta de esto no es buena :)

    despues de hace Type "c:\temp\archivos.txt" puesto que la pinta menos buena puede ser cualquier cosa, es decir que para cargar en el listbox lo que obtengo en esta imagen es complicado.

    Seguro que tiene el dir un parametro que me permite obviar todo esto, pero no me he molestado en investigar :)

    Saludos,


    phurtado
    miércoles, 12 de octubre de 2011 17:05
  • "Pedro Hurtado" escribió:

    > la verdad que sería muy constructivo ver como se pueden eliminar
    > los archivos "*.txt " que obtenga después de ejecutar esta
    > instruccion "dir c:\*.* /s> c:\temp\archivos.txt sin elevar
    > permisos, esa es la pregunta

    ¿Eliminarlos todos de una vez? Me imagino que se podrá hacer recorriendo el contenido del control ListBox, y llamando al método compartido 'Delete' de la clase 'System.IO.File'.

        IO.File.Delete(elemento ListBox)

    Se comprende que en el 'elemento ListBox' figura la ruta completa del archivo que se desea eliminar.

    Pero volvemos a las mismas. Si no tiene permisos para eliminar un archivo *.txt concreto, obtendrá la oportuna excepción en tiempo de ejecución.

     
    > Pero sigo sin respuesta :)

    ¿Es que tenía que contestar? Lo siento, no lo sabía.


    Enrique Martínez
      [MS MVP - VB]

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

    miércoles, 12 de octubre de 2011 18:11
    Moderador
  • Hola Enrique,

    Mejor lo dejamos aquí, tienes razon :)

    Saludos,


    phurtado
    miércoles, 12 de octubre de 2011 18:16
  • "Pedro Hurtado" escribió:

    > despues de hace Type "c:\temp\archivos.txt" puesto que la
    > pinta menos buena puede ser cualquier cosa, es decir que
    > para cargar en el listbox lo que obtengo en esta imagen
    > es complicado.
    >
    > dir c:\*.txt /s > c:\temp\archivos.txt

    Por supuesto que va a ser complicado insertar en el control ListBox ese contenido generado por el comando DIR.

    Yo indiqué que ejecutara el mismo que indicó Rafael:

       dir /b *.txt /s > C:\Temp\Archivos.txt

    ¡Hay diferencia con el que tú has ejecutado! ;-)

    > Seguro que tiene el dir un parametro que me permite obviar
    > todo esto, pero no me he molestado en investigar :)

    Cuando se ha querido obtener la ayuda en línea de los comandos de MS-DOS, siempre se ha recurrido a ejecutar:

      C:\> help dir

    o si lo prefieres:

      C:\> dir /?

     


    Enrique Martínez
      [MS MVP - VB]

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

    miércoles, 12 de octubre de 2011 18:18
    Moderador
  • Hola Enrique,

    Mira el help y el /? y el dir /b y todo eso lo conozco hace algunos años, pero tu sigues obviando la pregunta y evidentemente nunca respondes a como se van a eliminar los archivos sin elevar permisos. Quieres que formule yo la pregunta en otro hilo y me respondes?

    Enrique dale las vueltas que quieras pero te sigo diciendo que esto es una chapu, has solucionado ponle el 25% del problema el otro sigue corriendo :).

    Y como bien ha dicho Rafael si es para probar bien esta, pero tu pondrías esto en una app tuya?

    Saludos,


    phurtado
    miércoles, 12 de octubre de 2011 18:30
  • "Pedro Hurtado" escribió:

    > Mira el help y el /? y el dir /b y todo eso lo
    > conozco hace algunos años

    Discúlpame, pero como bien podrás comprender, ignoro si lo conocías o no. Simplemente me limité a comentarte cómo obtener la ayuda en línea porque tu mismo escribistes:

    > Seguro que tiene el dir un parametro que me permite obviar
    > todo esto, pero no me he molestado en investigar :)

    Como escribistes que "no te habías molestado en investigar", es por ello que me limité a indicarte cómo se obtiene la ayuda en línea de un comando DOS. Pero que si te ha molestado, te pido disculpas; no ha sido intención mía el hacerlo.

    > pero tu sigues obviando la pregunta y evidentemente
    > nunca respondes a como se van a eliminar los archivos
    > sin elevar permisos.
    >
    > Enrique dale las vueltas que quieras pero te sigo
    > diciendo que esto es una chapu, has solucionado ponle
    > el 25% del problema el otro sigue corriendo :).
    >
    > Y como bien ha dicho Rafael si es para probar bien
    > esta, pero tu pondrías esto en una app tuya?

    Pero ¡es que no me entero.! No sé por qué motivo dices que sigo obviando la pregunta, cuando anteriormente he respondido cómo se podría eliminar (repito, cómo se podría eliminar) los archivos contenidos en un control ListBox.

    ¿Que tú dices que es una "chapuza"? ¡Bueno! Me parece estupendo y respeto tu opinión, pero lo único que te puedo decir es que, si lo crees así, entonces te busques otra solución para eliminar un archivo distinta a la que yo propuse, que recuerdo era una llamada al método compartido Delete de la clase System.IO.File:

      IO.File.Delete(elemento ListBox)

    Pero insisto que la cuenta del usuario que desee eliminar un archivo, deberá tener los permisos preceptivos para poder hacerlo, con independencia que haya utilizado o no el comando DIR para crear un archivo de texto con el listado de todos los archivos con extensión *.txt existentes en una unidad del disco duro del PC.

    > Quieres que formule yo la pregunta en otro hilo
    > y me respondes?

    Noto en tu respuesta un "tonillo" que no me agrada. Quiero pensar que no es así.

    Si tu deseas formular una pregunta, estás en tu derecho de hacerlo. También estoy yo en mi derecho de responderla o no; que yo sepa, nadie me obliga a hacerlo.


    Enrique Martínez
      [MS MVP - VB]

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

    jueves, 13 de octubre de 2011 6:15
    Moderador
  • Hola Enrique,

    Noto en tu respuesta un "tonillo" que no me agrada. Quiero pensar que no es así.

    Piensa que no es así :), simplemente he comentado lo que no me gusta.

    Saludos,


    phurtado
    • Propuesto como respuesta Adrian_M miércoles, 22 de febrero de 2012 22:12
    jueves, 13 de octubre de 2011 7:45
  • Perdón pero no sé usar este foro, así que propuse el mensaje anterior cuando quería proponer otra cosa...

    El tema es que caí en la misma limitación que el comienzo de este trhead, y busqué por ahí pero no encontré nada más o menos útil.

    El problema es que todas las funciones GetDirectories o GetFiles del Framework fallan cuando se usan con el FLAG que permite buscar en Subcarpetas. Esto pasa en Vista, W7 y W2008 cuando se trata de acceder a una carpeta de sistema, sin importar si el usuario que corre el proceso es Administrador o nieto de Bill Gates.

    Simplemente da la excepción UnauthorizedAccessException y el bucle no se puede recorrer ya que la colección no se genera si al menos un item no es accesible. Esto quizás esté corregido en el Framework 4 ya que hay algunas enumeraciones más en la clase, pero para mí no era una opción el upgrade.

    La opción fue generar una función recurrente siempre especificando que devuelva las carpetas de nivel superior y atrapando la excepción.

    Mi problema original era similar al de Rafael, tenía que encontrar archivos con determinada extensión en la carpeta de usuarios de un Terminal Server/Citrix para eliminarlos.

    Esto fue lo que terminé haciendo, es bien simple...

        Private Function BuscarDir(ByVal Dir As DirectoryInfo) As Boolean
            'La funcion es recurrente porque no se puede llamar con el flag de busqueda de subcarpetas en W7 o W2008
            Dim d As DirectoryInfo
            Try
                BuscarDir = True
                For Each d In Dir.GetDirectories() 'Sin parametros busca solo en el primer nivel de carpetas
                    AddFilesToList(d.FullName)       'Aca busco determinados archivos
                    BuscarDir(d)                              'Volvemos a buscar en los hijos...
                Next
            Catch ex As Exception
                BuscarDir = False
            End Try

        End Function

    miércoles, 22 de febrero de 2012 22:31