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
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 :-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.
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.
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:
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.
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
Cada vez me confundes más :huh: :xD 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.
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
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:
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'
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
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 :xD).
If .ShowDialog = Windows.Forms.DialogResult.OK Then
ruta_txt.Text = (.SelectedPath)
Else
Exit Sub
End If
Algunas recomendaciones :silbar: 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
Muchas gracias por tu ayuda, me ha servido de muxo.
Un saludo:eduardogi
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 :o