elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Listador de archivos VB.NET
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Listador de archivos VB.NET  (Leído 9,843 veces)
eduardogi

Desconectado Desconectado

Mensajes: 46


Ver Perfil
Listador de archivos VB.NET
« en: 5 Agosto 2011, 21:27 pm »

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


En línea

Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: Listador de archivos VB.NET
« Respuesta #1 en: 5 Agosto 2011, 21:37 pm »

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
  1. For a = 0 To ListBox1.Items.Count - a

Más bien debería ser así:
Código
  1. 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.


« Última modificación: 5 Agosto 2011, 21:48 pm por Keyen Night » En línea

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

Desconectado Desconectado

Mensajes: 46


Ver Perfil
Re: Listador de archivos VB.NET
« Respuesta #2 en: 5 Agosto 2011, 21:56 pm »

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.
En línea

Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: Listador de archivos VB.NET
« Respuesta #3 en: 5 Agosto 2011, 22:04 pm »

Código
  1. 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
  1.        Dim _Stream As New IO.FileStream("C:\Ejemplo\Archivo.ejemplo",IO.FileMode.Open)
  2.        Dim _StreamWriter As New IO.StreamWriter(_Stream)

Has Flush y cierra el Stream después de usarlo.
« Última modificación: 5 Agosto 2011, 22:19 pm por Keyen Night » En línea

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

Desconectado Desconectado

Mensajes: 46


Ver Perfil
Re: Listador de archivos VB.NET
« Respuesta #4 en: 5 Agosto 2011, 23:24 pm »

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:

Citar
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
        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
En línea

Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: Listador de archivos VB.NET
« Respuesta #5 en: 6 Agosto 2011, 01:57 am »

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

Código
  1. Linea = Linea & vbNewLine & ListBox1.Items(a).ToString()

Y no

Código
  1. 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
  1.        For a = 0 To ListBox1.Items.Count - 1
  2.            Dim _Stream As New IO.FileStream(FolderBrowserDialog1.SelectedPath & "\listado.txt", IO.FileMode.Open)
  3.            Dim _StreamWriter As New IO.StreamWriter(_Stream)
  4.  
  5.            Linea = Linea & vbNewLine & ListBox1.Items(a).ToString()
  6.            _StreamWriter.Write("")
  7.            _StreamWriter.WriteLine(Linea)
  8.            _StreamWriter.Close()
  9.        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.
« Última modificación: 6 Agosto 2011, 02:14 am por Keyen Night » En línea

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

Desconectado Desconectado

Mensajes: 46


Ver Perfil
Re: Listador de archivos VB.NET
« Respuesta #6 en: 6 Agosto 2011, 02:58 am »

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
En línea

Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: Listador de archivos VB.NET
« Respuesta #7 en: 6 Agosto 2011, 03:12 am »

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
  1. Dim _Stream As New FileStream("C:\Archivo.ejemplo", FileMode.Open)
  2. Dim _StreamWriter As New StreamWriter(_Stream)
  3.  
  4. 'ESCRITURA DE EJEMPLO'
  5. For X As Integer = 0 To 10
  6.   _StreamWriter.WriteLine(X.ToString())
  7. Next
  8.  
  9. _Stream.Flush()
  10. _Stream.Close()
  11.  
  12. 'YA AQUI SE PUEDE ELIMINAR EL ARCHIVO'
  13.  
« Última modificación: 6 Agosto 2011, 03:20 am por Keyen Night » En línea

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

Desconectado Desconectado

Mensajes: 46


Ver Perfil
Re: Listador de archivos VB.NET
« Respuesta #8 en: 6 Agosto 2011, 17:39 pm »

Gracias por tu respuesta. Creo que ya lo tengo.

Código:
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
En línea

Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: Listador de archivos VB.NET
« Respuesta #9 en: 6 Agosto 2011, 22:29 pm »

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
  1.            If .ShowDialog = Windows.Forms.DialogResult.OK Then
  2.                ruta_txt.Text = (.SelectedPath)
  3.            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
  1.            If .ShowDialog = Windows.Forms.DialogResult.OK Then
  2.                ruta_txt.Text = (.SelectedPath)
  3.            Else
  4.                Exit Sub
  5.            End If

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

Código
  1. ' Usa '
  2. IO.File.Exists
  3. ' En Vez De '
  4. My.Computer.FileSystem.FileExists
  5.  
  6. ' Usa '
  7. MessageBox.Show()
  8.  
  9. ' En Vez De '
  10. MsgBox
  11.  
  12. ' Usa '
  13. Environment.NewLine
  14.  
  15. ' En Vez De '
  16. VbNewLine
  17.  
« Última modificación: 6 Agosto 2011, 22:31 pm por Keyen Night » En línea

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...
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines