Listador de archivos VB.NET

Iniciado por eduardogi, 5 Agosto 2011, 21:27 PM

0 Miembros y 4 Visitantes están viendo este tema.

eduardogi

Estoy empezando en VB.NET y el otro día me surgió la idea de desarrollar una aplicacion para listar los archivos de una carpeta. Me puse a ello, pero me han surgido 2 problemas que serán una tontería, pero que no consigo solucionar.

*El primero: Primero selecciona la ruta de la carpeta y me lista todo los archivos en listbox. Ahora querría guardar esta lista en un archivo de texto.
Este es el código que llevo pero me da error.


Dim rutaFichero As String
        rutaFichero = Form1.ruta_txt.Text
        With FolderBrowserDialog1
            .Description = "Seleccionar la carpeta"
            If .ShowDialog = Windows.Forms.DialogResult.OK Then
                ruta_txt.Text = (.SelectedPath)
                MsgBox("Se va a crear un fichero de texto en la siguiente ruta " & Chr(10) & (.SelectedPath))
            End If
        End With
        Try
            Dim oSW As New StreamWriter(FolderBrowserDialog1.SelectedPath)
            Dim a As Integer
            For a = 0 To ListBox1.Items.Count - a
                Dim Linea = ListBox1.Items(a).ToString()
                oSW.WriteLine(Linea)
                oSW.Flush()
            Next
                catch
            MsgBox("No se ha podido crear el fichero por falta de permisos" & Chr(10) & " Intente ejecutar la aplicacion con derechos de administrador", MsgBoxStyle.Critical)


        End Try


*El segundo es que pongo otra opción para copiar toda la lista al porta-papeles. Creo que lo mas fácil es primero llevarlo a un textbox y luego copiar el contenido, pero no se si es la mejor opcion:

Form3.copia_txt.Text = ""
        For i = 0 To ListBox1.SelectedItems.Count - 1
            Form3.copia_txt.Text = Form3.copia_txt.Text & Chr(10) & ListBox1.Items(i).ToString()
        Next
        Form3.Show()


Muchas gracias de antemano.
Un saludo: eduardogi

Keyen Night

#1
Usa el Tag (code=vb.net)(/code) con corchetes ([]) cuando vayas a escribir código.

Cual es el error que te marca exactamente y en que línea del código?

No me parece esto de:
Código (vb.net) [Seleccionar]
For a = 0 To ListBox1.Items.Count - a

Más bien debería ser así:
Código (vb.net) [Seleccionar]
For a = 0 To ListBox1.Items.Count - 1

Invocas al constructor de StreamWriter con el nombre de una carpeta  :-X

Usa el Flush antes de cerrar el Stream, no trabajas con gran cantidad de datos como para vaciar los Buffer en cada escritura.

Cierra el Stream después de que no lo necesites más.
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

eduardogi

Lo primero gracias por tu respuesta.

El error es este:
Excepción del tipo 'System.UnauthorizedAccessException' en mscorlib.dll
En esta linea:
Dim oSW As New StreamWriter(FolderBrowserDialog1.SelectedPath)

Y como tu dices se me ha colado la pata y es con el -1.

Keyen Night

#3
Código (vb.net) [Seleccionar]
Dim oSW As New StreamWriter(FolderBrowserDialog1.SelectedPath)

Te recuerdo que FolderBrowserDialog1.SelectedPath te retorna el DIRECTORIO seleccionado, por ejemplo:

C:\EJEMPLO

No es un archivo y por lo tanto no lo puedes abrir como uno con un StreamWriter, debes agregar "\" ( el separador de Path ) y el nombre del archivo a escribir:

FolderBrowserDialog1.SelectedPath & "\Archivo.ejemplo"

La forma correcta de hacer lo que intentas es  abriendo el archivo de esta manera:

Código (vb.net) [Seleccionar]
       Dim _Stream As New IO.FileStream("C:\Ejemplo\Archivo.ejemplo",IO.FileMode.Open)
       Dim _StreamWriter As New IO.StreamWriter(_Stream)


Has Flush y cierra el Stream después de usarlo.
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

eduardogi

Gracias nuevamente por tu respuesta. jaja por fin consigo que me funcione.
Ahora un problema que no consigo solucionar, es borrar el fichero antes de escribir en el.
Os dejo en codigo:

CitarDim rutaFichero As String
        rutaFichero = Form1.ruta_txt.Text
        With FolderBrowserDialog1
            .Description = "Seleccionar la carpeta"
            If .ShowDialog = Windows.Forms.DialogResult.OK Then
                ruta_txt.Text = (.SelectedPath)
            End If
            MsgBox("Listado.txt va ser creado en la siguiente ruta" & Chr(10) & (.SelectedPath))
        End With


        If Not My.Computer.FileSystem.FileExists(FolderBrowserDialog1.SelectedPath & "\listado.txt") Then
            Dim Archivo As System.IO.FileStream
            Archivo = System.IO.File.Create(FolderBrowserDialog1.SelectedPath & "\listado.txt")
            Archivo.Close()
        End If


        Dim a As Integer
        Dim Linea As String
        For a = 0 To ListBox1.Items.Count - 1
            Dim _Stream As New IO.FileStream(FolderBrowserDialog1.SelectedPath & "\listado.txt", IO.FileMode.Open)
            Dim _StreamWriter As New IO.StreamWriter(_Stream)

            Linea = Linea & vbNewLine & ListBox1.Items(a).ToString()
            _StreamWriter.Write("")
            _StreamWriter.WriteLine(Linea)
            _StreamWriter.Close()
        Next
        Dim _Stream2 As New IO.FileStream(FolderBrowserDialog1.SelectedPath & "\listado.txt", IO.FileMode.Open)
        Dim _StreamWriter2 As New IO.StreamWriter(_Stream2)
        _StreamWriter2.WriteLine("Programa desarollado por Eduardo Giralda" & vbNewLine & "Ruta: " & ruta_txt.Text & vbNewLine & "Numero de archivos: " & n_lbl.Text & vbNewLine & "" & vbNewLine & Linea)
        _StreamWriter2.Close()
        MsgBox("Archivo creado correctamente")

Un saludo: eduardogi

Keyen Night

#5
Cada vez me confundes más :huh: :xD porque agregas esto?

Código (vb.net) [Seleccionar]
Linea = Linea & vbNewLine & ListBox1.Items(a).ToString()

Y no

Código (vb.net) [Seleccionar]
Linea = ListBox1.Items(a).ToString()

Te has complicado al extremo, para escribir un archivo con un StreamWriter no necesitas (a menos que no te hayas dado cuenta) lo que haces aquí:

Código (vb.net) [Seleccionar]
       For a = 0 To ListBox1.Items.Count - 1
           Dim _Stream As New IO.FileStream(FolderBrowserDialog1.SelectedPath & "\listado.txt", IO.FileMode.Open)
           Dim _StreamWriter As New IO.StreamWriter(_Stream)

           Linea = Linea & vbNewLine & ListBox1.Items(a).ToString()
           _StreamWriter.Write("")
           _StreamWriter.WriteLine(Linea)
           _StreamWriter.Close()
       Next


Creas el Stream, creas el StreamWriter, escribes y cierras una y otra vez las intrucciones están en un for se repiten tantas veces como ListBox Items tenga.

Es como si escribieras en un cuaderno y para cada palabra cierras y abres el cuaderno, no tiene sentido :-[

Debes colocar el .Close fuera del for así como el invocar dentro de un for es de mala práctica no se debe hacer, y lo que haces con el segundo StreamWriter lo puede hacer con el primero antes de cerrarlo, no puedes abrir un mismo archivo con 2 StreamWriter diferentes a menos que le asignes la opción de compartir la escritura/lectura del archivo, y no puedes eliminar el archivo por que no has cerrado _Stream y no lo puedes cerrar porque lo invocastes en el espacio del for y fuera de el el Stream no existe a pesar de que el archivo sigue abierto, mira el código cierras son los Writer pero eso no cierra el archivo.
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

eduardogi

Es que he tenido un montón de problemas. Si sacaba del for el close me decía que no estaba declarado, y si lo ponía de otras formas me daba error porque decía que el archivo estaba abierto.
Puede acarrear algún error o solo que es mas lento el programa??

Un saludo: eduardogi

Keyen Night

#7
Con lo de invocar dentro del for llenas memoria de manera innecesaria, a pesar de que invoques una variable con el mismo nombre, es una nueva asignación y se guarda en memoria como nueva variable y la anterior queda flotando porque está creada pero no hay forma de hacer referencia a ella, si lo hicieras con variables que tardaran más en construirse el programa se tornaría muy lento.

Con respecto a cerrar y abrir el Stream para cada vez que vas a escribir no es necesario explicar a menos que vayas a tomar un dictado cerrando y abriendo el cuaderno con cada palabra :xD :xD :xD

La forma correcta es esta:

Código (vb.net) [Seleccionar]

Dim _Stream As New FileStream("C:\Archivo.ejemplo", FileMode.Open)
Dim _StreamWriter As New StreamWriter(_Stream)

'ESCRITURA DE EJEMPLO'
For X As Integer = 0 To 10
  _StreamWriter.WriteLine(X.ToString())
Next

_Stream.Flush()
_Stream.Close()

'YA AQUI SE PUEDE ELIMINAR EL ARCHIVO'
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

eduardogi

Gracias por tu respuesta. Creo que ya lo tengo.

Dim rutaFichero As String
        rutaFichero = Form1.ruta_txt.Text
        With FolderBrowserDialog1
            .Description = "Seleccionar la carpeta"
            If .ShowDialog = Windows.Forms.DialogResult.OK Then
                ruta_txt.Text = (.SelectedPath)
            End If
            MsgBox("Listado.txt va ser creado en la siguiente ruta" & Chr(10) & (.SelectedPath))
        End With


        If Not My.Computer.FileSystem.FileExists(FolderBrowserDialog1.SelectedPath & "\listado.txt") Then
            Dim Archivo As System.IO.FileStream
            Archivo = System.IO.File.Create(FolderBrowserDialog1.SelectedPath & "\listado.txt")
            Archivo.Close()
        End If


        Dim a As Integer
        Dim Linea As String
        Dim _Stream As New IO.FileStream(FolderBrowserDialog1.SelectedPath & "\listado.txt", IO.FileMode.Open)
        Dim _StreamWriter As New IO.StreamWriter(_Stream)
        _StreamWriter.WriteLine("Programa desarollado por Eduardo Giralda" & vbNewLine & "Ruta: " & ruta_txt.Text & vbNewLine & "Numero de archivos: " & n_lbl.Text & vbNewLine & "")
        For a = 0 To ListBox1.Items.Count - 1
            Linea = ListBox1.Items(a).ToString()
            _StreamWriter.WriteLine(Linea)

        Next
        _StreamWriter.Close()
        MsgBox("Archivo creado correctamente")


Un saludo: eduardogi

Keyen Night

#9
Al final en _StreamWriter.Close() estas cerrando el escritor del stream no el stream principal, el archivo sigue abierto, cierra con _Stream.Close() hacer eso tambien cierra el Writer.

Dónde dice

Código (vb.net) [Seleccionar]
           If .ShowDialog = Windows.Forms.DialogResult.OK Then
               ruta_txt.Text = (.SelectedPath)
           End If


Si el usuario presiona cancelar y no aceptar sigue corriendo la ejecución de las demás instruciones, agrega un Else Exit Sub (asumo que estás en un Sub sino Exit Function y dónde sea que estes :xD).

Código (vb.net) [Seleccionar]
           If .ShowDialog = Windows.Forms.DialogResult.OK Then
               ruta_txt.Text = (.SelectedPath)
           Else
               Exit Sub
           End If


Algunas recomendaciones :silbar: estás en .Net, usa:

Código (vb.net) [Seleccionar]

' Usa '
IO.File.Exists
' En Vez De '
My.Computer.FileSystem.FileExists

' Usa '
MessageBox.Show()

' En Vez De '
MsgBox

' Usa '
Environment.NewLine

' En Vez De '
VbNewLine
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...