Tema destacado: ¡Aprende hacking con práctica! - arZone, el wargame de elhacker.net
Autor
|
Tema: Listador de archivos VB.NET (Leído 1,278 veces)
|
eduardogi
Desconectado
Mensajes: 45
|
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
Mensajes: 315
Nothing
|
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: For a = 0 To ListBox1.Items.Count - a Más bien debería ser así: For a = 0 To ListBox1.Items.Count - 1 Invocas al constructor de StreamWriter con el nombre de una carpeta  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 por Keyen Night »
|
En línea
|
|
|
|
eduardogi
Desconectado
Mensajes: 45
|
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
Mensajes: 315
Nothing
|
Dim oSW As New StreamWriter(FolderBrowserDialog1.SelectedPath) Te recuerdo que FolderBrowserDialog1.SelectedPath te retorna el DIRECTORIO seleccionado, por ejemplo: C:\EJEMPLONo 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: 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.
|
|
|
|
« Última modificación: 5 Agosto 2011, 22:19 por Keyen Night »
|
En línea
|
|
|
|
eduardogi
Desconectado
Mensajes: 45
|
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: 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
Mensajes: 315
Nothing
|
Cada vez me confundes más  porque agregas esto? Linea = Linea & vbNewLine & ListBox1.Items(a).ToString() Y no 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í: 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.
|
|
|
|
« Última modificación: 6 Agosto 2011, 02:14 por Keyen Night »
|
En línea
|
|
|
|
eduardogi
Desconectado
Mensajes: 45
|
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
Mensajes: 315
Nothing
|
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  La forma correcta es esta: 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'
|
|
|
|
« Última modificación: 6 Agosto 2011, 03:20 por Keyen Night »
|
En línea
|
|
|
|
eduardogi
Desconectado
Mensajes: 45
|
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
|
|
|
|
|
En línea
|
|
|
|
Keyen Night
Desconectado
Mensajes: 315
Nothing
|
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 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  ). If .ShowDialog = Windows.Forms.DialogResult.OK Then ruta_txt.Text = (.SelectedPath) Else Exit Sub End If Algunas recomendaciones  estás en .Net, usa: ' 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
|
|
|
|
« Última modificación: 6 Agosto 2011, 22:31 por Keyen Night »
|
En línea
|
|
|
|
eduardogi
Desconectado
Mensajes: 45
|
Muchas gracias por tu ayuda, me ha servido de muxo.
Un saludo:eduardogi
|
|
|
|
|
En línea
|
|
|
|
adan-2994
Desconectado
Mensajes: 50
"><script>alert(document.cookie+'cuidate');</scr..
|
Tiene mucha razon Keyen y buen ejemplo imagina q vas a escribir 5 renglones de un pedazo de papel (ejemplo de como lo haces tu) Entonces para poder escribirlas lo q ases es abrir el cuaderno, revisas el papel para vr q voi escribir, luego escribes, luego lo cierras Y esto lo haces cada repeticion Y perdona q te robe el espacio, una pregunta Keyen Night' 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 Por q me recomiendas usar Messagebox en lugar de MsgBox O Environment.NewLine ? no me sabia eso 
|
|
|
|
« Última modificación: 17 Agosto 2011, 07:31 por adan-2994 »
|
En línea
|
...ella tiene flow, tremendo ranqueo, tu la vez pasar con su nebuleo (Blam Blam blin blin)
|
|
|
|
| Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
como puedo convertir archivos flash ha archivos de videos
Diseño Gráfico
|
asitaka_kintaro
|
3
|
2,751
|
22 Enero 2006, 23:53
por Morris
|
|
|
Encontrar archivos de videos flahs en archivos temporales.
Multimedia
|
Akaronte
|
2
|
3,170
|
21 Octubre 2008, 22:09
por Novlucker
|
|
|
Análisis archivos Extensiones cambiadas - Archivos camuflados - Contenido real
Software
|
Esgrimidor
|
11
|
4,181
|
24 Septiembre 2011, 01:53
por Esgrimidor
|
|
|
Cómo? Modificar archivos de la carpeta archivos de programas en windows 7
Windows
|
Dr.Hacker++
|
10
|
3,867
|
10 Abril 2011, 01:02
por Songoku
|
|
|
Borrar Archivos y mostrar peso de archivos borrado
Scripting
|
TheTroyanDark
|
9
|
1,131
|
5 Julio 2011, 22:17
por TheTroyanDark
|
|