Autor
|
Tema: VB Copiar archivos de una carpeta (listbox1 y 2) cambiando nombre desde un textb (Leído 7,987 veces)
|
mortygor
Desconectado
Mensajes: 11
|
Perdon, es para VISUAL BASIC.
Buenas, tengo un 2 listbox que al iniciar el form cargan una ruta especifica y me listan los archivos. También un textbox y un botón.
Cuando selecciono en el listbox1 un Item, pongo en el textbox un nuevo nombre y cuando le doy al button, me gustaria que pasase el archivo con el nombre cambiado. Esto es lo que pongo en el button para pasar el item, pero solo pasa el item. ListBox2.Items.Add (ListBox1.Items.Item (ListBox1.SelectedIndex)) He probado con. My.Computer.FileSystem.copyFile("C:\TestDir1\test.txt", "C:\TestDir2\test2.txt") Pero no funciona porque quiero ponerle el nombre desde un textbox. Estoy en cruce ahora mismo, me podeis guiar un poco por donde tengo que seguir, porque no lo veo. Gracias.
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.921
|
Estoy en cruce ahora mismo, me podeis guiar un poco por donde tengo que seguir, porque no lo veo.
Te lo voy a poner bien facilito, código fuente completo y comentado en Español... Public NotInheritable Class Form1 : Inherits Form Private srcFolderPath As String = "C:\Folder A" ' Directorio de origen Private dstFolderPath As String = "C:\Folder B" ' Directorio de destino Private WithEvents SrcCollection As ObservableCollection(Of FileInfo) ' Colección de archivos del directorio de origen Private WithEvents DstCollection As ObservableCollection(Of FileInfo) ' Colección de archivos del directorio de destino ' Obtiene el nuevo nombre que será asignado al archivo de origen al moverlo al directorio de destino... Private ReadOnly Property NewFilename As String Get Return Me.TextBox1?.Text.Trim() End Get End Property Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load ' Construimos las colecciones de archivos del directorio de origen y destino, ' y enlazamos dichas colecciones a los ListBoxes... Dim srcFiles As IEnumerable(Of FileInfo) = New DirectoryInfo(Me.srcFolderPath).EnumerateFiles("*", SearchOption.TopDirectoryOnly) Dim dstFiles As IEnumerable(Of FileInfo) = New DirectoryInfo(Me.dstFolderPath).EnumerateFiles("*", SearchOption.TopDirectoryOnly) Me.SrcCollection = New ObservableCollection(Of FileInfo)(srcFiles) Me.DstCollection = New ObservableCollection(Of FileInfo)(dstFiles) Me.ListBox1.Sorted = True Me.ListBox1.DisplayMember = "Name" Me.ListBox1.DataSource = Me.SrcCollection Me.ListBox2.Sorted = True Me.ListBox2.DisplayMember = "Name" Me.ListBox2.DataSource = Me.DstCollection End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' Verificamos que haya algún elemento seleccionado antes de continuar... If (Me.ListBox1.SelectedIndex = -1) Then Exit Sub End If ' Obtenemos el archivo de origen que queremos mover al directorio de destino. Dim srcFile As FileInfo = Me.SrcCollection.Single(Function(fi As FileInfo) fi.Name = Me.ListBox1.SelectedItem.ToString()) ' Construimos el nuevo nombre de archivo para la ruta de destino. Dim dstFileName As String = If(String.IsNullOrWhiteSpace(Me.NewFilename), srcFile.Name, Me.NewFilename & If(Path.HasExtension(srcFile.Name), Path.GetExtension(srcFile.Name), "")) ' Construimos la ruta completa de destino Dim dstFullFilePath As String = Path.Combine(Me.dstFolderPath, dstFileName) ' Y declaramos un objeto del tipo FileInfo que representa al archivo de destino. Dim dstFile As New FileInfo(dstFullFilePath) ' Verificamos que el nombre del archivo de origen (con el nuevo nombre de archivo aplicado) no exista en la colección de destino. If (Me.DstCollection.FirstOrDefault(Function(fi As FileInfo) fi.Name = dstFileName) IsNot Nothing) Then Throw New Exception("File name already exist in the destination collection.") End If ' Verificamos que el archivo de origen (con el nuevo nombre de archivo aplicado) no exista en el directorio de destino. If (dstFile.Exists) Then Throw New IOException("File already exist in the destination directory.") End If Try ' Movemos el archivo de origen a la ruta de destino. srcFile.MoveTo(dstFile.FullName) Catch ex As Exception Throw End Try ' Actualizamos las colecciones de archivos. Me.SrcCollection.Remove(srcFile) Me.DstCollection.Add(dstFile) ' Restauramos la entrada de datos de los controles. Me.TextBox1.Clear() End Sub Private Sub SrcCollection_CollectionChanged(sender As Object, e As NotifyCollectionChangedEventArgs) Handles SrcCollection.CollectionChanged Me.ListBox1.BeginUpdate() Me.ListBox1.DataSource = Nothing Me.ListBox1.DisplayMember = "Name" Me.ListBox1.DataSource = DirectCast(sender, ObservableCollection(Of FileInfo)) Me.ListBox1.EndUpdate() End Sub Private Sub DstCollection_CollectionChanged(sender As Object, e As NotifyCollectionChangedEventArgs) Handles DstCollection.CollectionChanged Me.ListBox2.BeginUpdate() Me.ListBox2.DataSource = Nothing Me.ListBox2.DisplayMember = "Name" Me.ListBox2.DataSource = DirectCast(sender, ObservableCollection(Of FileInfo)) Me.ListBox2.EndUpdate() End Sub End Class
En la interfaz de usuario se debe añadir un TextBox, un Button y dos ListBox. Saludos.
|
|
« Última modificación: 3 Julio 2018, 21:31 pm por Eleкtro »
|
En línea
|
|
|
|
mortygor
Desconectado
Mensajes: 11
|
Hola Elektro, lo primero muchas gracias por contestar, voy a probarlo y te cuento.
Muchas gracias y un saludo.
|
|
|
En línea
|
|
|
|
mortygor
Desconectado
Mensajes: 11
|
Hola, alguna cosa no encaja, me salen bastantes fallos. Esto es lo que tengo en este form.
Imports System.Runtime.InteropServices Imports System Imports System.IO
Public Class Form2 '-------------------NECESARIO PARA VIGILAR LOS ARCHIVOSDE UNA CARPETA Public WithEvents fswc As FileSystemWatcher
'------------------- MOVER EL FORMULARIO <DllImport("user32.DLL", EntryPoint:="ReleaseCapture")> Private Shared Sub ReleaseCapture() End Sub
<DllImport("user32.DLL", EntryPoint:="SendMessage")> Private Shared Sub SendMessage(ByVal hWnd As System.IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Me.Close() 'orden para cerrar'
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Me.WindowState = FormWindowState.Minimized 'orden para minimizar'
End Sub
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim directory2 = "C:\Users\mortigor\Desktop\iconos2" Dim files2() As System.IO.FileInfo Dim dirinfo2 As New System.IO.DirectoryInfo(directory2) files2 = dirinfo2.GetFiles("*.mp4", IO.SearchOption.AllDirectories) ' DECIRLE QUE EXTENSION DE ARCHIVO For Each file In files2 ListBox2.Items.Add(file)
Next
''''''''''''''''' NECESARIO PARA VIGILAR LOS ARCHIVOSDE UNA CARPETA Me.CheckForIllegalCrossThreadCalls = False
fswc = New FileSystemWatcher("C:\Users\Alfredo\Desktop\iconos") fswc.IncludeSubdirectories = False fswc.EnableRaisingEvents = True '---------------------------------------
'muestra contenido carpeta'
Dim directory = "C:\Users\mortigor\Desktop\iconos" Dim files() As System.IO.FileInfo Dim dirinfo As New System.IO.DirectoryInfo(directory) files = dirinfo.GetFiles("*.mp4", IO.SearchOption.AllDirectories) ' DECIRLE QUE EXTENSION DE ARCHIVO For Each file In files ListBox1.Items.Add(file)
Next
End Sub
Private Sub Panel1_MouseMove(sender As Object, e As MouseEventArgs) Handles Panel1.MouseMove ReleaseCapture() SendMessage(Me.Handle, &H112&, &HF012&, 0) End Sub
Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
End Sub
Private Sub fswc_Changed(sender As Object, e As FileSystemEventArgs) Handles fswc.Changed ListBox1.Items.Clear() Dim directory = "C:\Users\mortigor\Desktop\iconos" Dim files() As System.IO.FileInfo Dim dirinfo As New System.IO.DirectoryInfo(directory) files = dirinfo.GetFiles("*.mp4", IO.SearchOption.AllDirectories) ' DECIRLE QUE EXTENSION DE ARCHIVO For Each file In files ListBox1.Items.Add(file)
Next End Sub
Private Sub fswc_Created(sender As Object, e As FileSystemEventArgs) Handles fswc.Created ListBox1.Items.Clear() Dim directory = "C:\Users\mortigor\Desktop\iconos" Dim files() As System.IO.FileInfo Dim dirinfo As New System.IO.DirectoryInfo(directory) files = dirinfo.GetFiles("*.mp4", IO.SearchOption.AllDirectories) ' DECIRLE QUE EXTENSION DE ARCHIVO For Each file In files ListBox1.Items.Add(file)
Next End Sub
Private Sub fswc_Deleted(sender As Object, e As FileSystemEventArgs) Handles fswc.Deleted ListBox1.Items.Clear() Dim directory = "C:\Users\mortigor\Desktop\iconos" Dim files() As System.IO.FileInfo Dim dirinfo As New System.IO.DirectoryInfo(directory) files = dirinfo.GetFiles("*.mp4", IO.SearchOption.AllDirectories) ' DECIRLE QUE EXTENSION DE ARCHIVO For Each file In files ListBox1.Items.Add(file)
Next End Sub
Private Sub fswc_Disposed(sender As Object, e As EventArgs) Handles fswc.Disposed ListBox1.Items.Clear() End Sub
Private Sub fswc_Error(sender As Object, e As ErrorEventArgs) Handles fswc.[Error] ListBox1.Items.Clear() End Sub
Private Sub fswc_Renamed(sender As Object, e As RenamedEventArgs) Handles fswc.Renamed ListBox1.Items.Clear() Dim directory = "C:\Users\mortigor\Desktop\iconos" Dim files() As System.IO.FileInfo Dim dirinfo As New System.IO.DirectoryInfo(directory) files = dirinfo.GetFiles("*.mp4", IO.SearchOption.AllDirectories) ' DECIRLE QUE EXTENSION DE ARCHIVO For Each file In files ListBox1.Items.Add(file)
Next End Sub
Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
End Sub Private Sub Label2_Click(sender As Object, e As EventArgs) Handles Label2.Click
End Sub
Private Sub Label3_Click(sender As Object, e As EventArgs) Handles Label3.Click
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
End Sub
Private Sub TextBox4_TextChanged(sender As Object, e As EventArgs) Handles TextBox4.TextChanged
End Sub
Private Sub ListBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox2.SelectedIndexChanged
End Sub
Private Sub BackgroundWorker1_DoWork(sender As Object, e As ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
End Sub
Esto es lo que tengo por ahora, me lee el archivo el listbox, tengo un watcher para que me lo actualice cada vez que hay algún cambio.
Tengo 2 listbox, button, listbox.
No se como encajarlo..
|
|
« Última modificación: 4 Julio 2018, 16:00 pm por mortygor »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.921
|
Debes usar el botón específico que sirve para insertar código con formato... me salen bastantes fallos. ¿Fallos de compilación, o fallos en tiempo de ejecución?. De todas formas en lugar de poner todo el código, mejor si muestras el código relevante, es decir, el bloque de método que contiene la instrucción donde te marca el error que sea, y menciona el tipo de excepción y el mensaje de error, no somos adivinos... Saludos
|
|
« Última modificación: 4 Julio 2018, 16:10 pm por Eleкtro »
|
En línea
|
|
|
|
mortygor
Desconectado
Mensajes: 11
|
Perdona, tienes razon, he ido demasiado rapido y al final no se ni lo que pongo ni el como.... La verdad es que estoy "rallado" y me da la impresión de que en vez de hacer estoy deshaciendo.... Pero bueno. Te lo pongo en varios que no me coje mas de 100 lineas creo. Imports System Imports System.IO Public Class Form2 Private srcFolderPath As String = "C:\Users\morygor\Desktop\iconos1" ' Directorio de origen Private cdstFolderPath As String = "C:\Users\morygor\Desktop\iconos2" ' Directorio de destino Private WithEvents SrcCollection As [i]ObservableCollection(Of FileInfo)[/i] ' Colección de archivos del directorio de origen ´ESTO QUE ESTA ENTRE LA I , NO ESTA DEFINIDO EL TIPO ObservableCollection Private WithEvents DstCollection As [i]ObservableCollection(Of FileInfo)[/i]' Colección de archivos del directorio de destino ´ESTO QUE ESTA ENTRE LA I , NO ESTA DEFINIDO EL TIPO ObservableCollection ' Obtiene el nuevo nombre que será asignado al archivo de origen al moverlo al directorio de destino... Private ReadOnly Property NewFilename As String Get Return Me.TextBox4.Text.Trim() End Get End Property '-------------------NECESARIO PARA VIGILAR LOS ARCHIVOSDE UNA CARPETA Public WithEvents fswc As FileSystemWatcher '------------------- MOVER EL FORMULARIO <DllImport("user32.DLL", EntryPoint:="ReleaseCapture")> Private Shared Sub ReleaseCapture() End Sub <DllImport("user32.DLL", EntryPoint:="SendMessage")> Private Shared Sub SendMessage(ByVal hWnd As System.IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Me.Close() 'orden para cerrar' End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Me.WindowState = FormWindowState.Minimized 'orden para minimizar' End Sub Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' Construimos las colecciones de archivos del directorio de origen y destino, ' y enlazamos dichas colecciones a los ListBoxes... Dim srcFiles As IEnumerable(Of FileInfo) = [i]New DirectoryInfo(Me.srcFolderPath).EnumerateFiles[/i]("*", SearchOption.TopDirectoryOnly) ---- pone que no es un miembro de directoryinfo Dim dstFiles As IEnumerable(Of FileInfo) = New DirectoryInfo[color=green][i](Me.dstFolderPath)[/i][/color].EnumerateFiles("*", SearchOption.TopDirectoryOnly) ' NO es un miembro de form2 Me.SrcCollection = NeW [i]ObservableCollection(Of FileInfo)[/i](srcFiles)' NO ESTA DEFINIDO ObservableCollection Me.DstCollection = New [i]ObservableCollection(Of FileInfo)[/i](dstFiles)' NO ESTA DEFINIDO ObservableCollection
|
|
« Última modificación: 4 Julio 2018, 16:47 pm por mortygor »
|
En línea
|
|
|
|
mortygor
Desconectado
Mensajes: 11
|
Me.ListBox1.Sorted = True Me.ListBox1.DisplayMember = "Name" Me.ListBox1.DataSource = Me.SrcCollection Me.ListBox2.Sorted = True Me.ListBox2.DisplayMember = "Name" Me.ListBox2.DataSource = Me.DstCollection End Sub Dim directory2 = "C:\Users\Alfredo\Desktop\iconos2" Dim files2() As System.IO.FileInfo Dim dirinfo2 As New System.IO.DirectoryInfo(directory2) files2 = dirinfo2.GetFiles("*.mp4", IO.SearchOption.AllDirectories) ' DECIRLE QUE EXTENSION DE ARCHIVO ´AQUI MI CODIGO COMIENZA A DAR FALLOS. For Each file In files2 ´AQUI MI CODIGO COMIENZA A DAR FALLOS. ListBox2.Items.Add(file) ´AQUI MI CODIGO COMIENZA A DAR FALLOS. Next ''''''''''''''''' NECESARIO PARA VIGILAR LOS ARCHIVOSDE UNA CARPETA Me.CheckForIllegalCrossThreadCalls = False ´AQUI MI CODIGO COMIENZA A DAR FALLOS. fswc = New FileSystemWatcher("C:\Users\Alfredo\Desktop\iconos") ´AQUI MI CODIGO COMIENZA A DAR FALLOS. fswc.IncludeSubdirectories = False ´AQUI MI CODIGO COMIENZA A DAR FALLOS. fswc.EnableRaisingEvents = True ´AQUI MI CODIGO COMIENZA A DAR FALLOS. '--------------------------------------- 'muestra contenido carpeta' Dim directory = "C:\Users\Alfredo\Desktop\iconos" Dim files() As System.IO.FileInfo Dim dirinfo As New System.IO.DirectoryInfo(directory) files = dirinfo.GetFiles("*.mp4", IO.SearchOption.AllDirectories) ' DECIRLE QUE EXTENSION DE ARCHIVO ´AQUI MI CODIGO COMIENZA A DAR FALLOS. For Each file In files ´AQUI MI CODIGO COMIENZA A DAR FALLOS. ListBox1.Items.Add(file) ´AQUI MI CODIGO COMIENZA A DAR FALLOS. Next End Sub
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.921
|
Te lo pongo en varios que no me coje mas de 100 lineas creo. ¿Qué habiamos dicho de mostrar solamente el código relevante donde te marca el error?, si me muestras todo el código completo pero no me indicas donde te marca el error no solucionamos nada xD, de todas formas si piensas compartir muchas lineas de código no hagas un desastre publicando doble y triple posts o cosas así (por si acaso, que me lo veo venir), puedes usar este servicio de aquí abajo y colocar el enlace que hayas generado... EDITO: has comentado en muchas lienas "AQUI MI CODIGO COMIENZA A DAR FALLOS.", ¿pero podrías mencionar el tipo de excepción y el mensaje de error?, ¿o sino a que tipo de fallo te refieres?. Debo preguntártelo por si acaso, ¿sabes como obtener la info que te estoy pidiendo?, es decir, ¿sabes obtener datos de depuración de forma básica?. Saludos
|
|
« Última modificación: 4 Julio 2018, 17:05 pm por Eleкtro »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.921
|
Primero de todo, te faltaba añadir estos imports: Imports System.Collections.ObjectModel Imports System.Collections.Specialized
Segundo, todo este bloque: Dim directory2 = "C:\Users\Alfredo\Desktop\iconos2" Dim files2() As System.IO.FileInfo Dim dirinfo2 As New System.IO.DirectoryInfo(directory2) files2 = dirinfo2.GetFiles("*.mp4", IO.SearchOption.AllDirectories) ' DECIRLE QUE EXTENSION DE ARCHIVO Next ''''''''''''''''' NECESARIO PARA VIGILAR LOS ARCHIVOSDE UNA CARPETA Me.CheckForIllegalCrossThreadCalls = False fswc = New FileSystemWatcher("C:\Users\Alfredo\Desktop\iconos") fswc.IncludeSubdirectories = False fswc.EnableRaisingEvents = True '--------------------------------------- 'muestra contenido carpeta' Dim directory = "C:\Users\Alfredo\Desktop\iconos" Dim files() As System. IO. FileInfo Dim dirinfo As New System.IO.DirectoryInfo(directory) files = dirinfo. GetFiles("*.mp4", IO. SearchOption. AllDirectories) ' DECIRLE QUE EXTENSION DE ARCHIVO Next End Sub
...todos los errores que tengas en esas lineas se deben a que el bloque del método está abierto, vaya, le faltaría un: Private Sub NOMBRE_DEL_METODO() ...
La instrucción: Me.CheckForIllegalCrossThreadCalls = false
Debería ser así: Control.CheckForIllegalCrossThreadCalls = false
De todas formas no es nada recomendable que hagas eso, si necesitas realizar alguna operación desde un thread distinto al thread de la UI y necesitas que ese thread interactue con los controles de la UI entonces te conviene usar la clase BackgroundWorker.
Todo esto de aquí abajo es un desorden de métodos/controladores de eventos declarados fuera de la clase, obvio que te de error... Private Sub TextBox4_TextChanged(sender As Object, e As EventArgs) Handles TextBox4.TextChanged End Sub Private Sub ListBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox2.SelectedIndexChanged End Sub Private Sub BackgroundWorker1_DoWork(sender As Object, e As ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork End Sub
Saludos
|
|
« Última modificación: 4 Julio 2018, 18:02 pm por Eleкtro »
|
En línea
|
|
|
|
mortygor
Desconectado
Mensajes: 11
|
Hola!
estoy viendo lo que me comentaste, esta parte no la entiendo muy bien.
Private Sub NOMBRE_DEL_METODO()
Nombre del método? podría poner cualquier nombre?
Muchas gracias por la ayuda, voy a ver si me aclaro.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
copiar archivo a carpeta con nombre con espacios
Programación Visual Basic
|
txomin
|
5
|
8,273
|
28 Junio 2005, 20:33 pm
por programatrix
|
|
|
Copiar los archivos de la papelera a otra carpeta
Scripting
|
@felipe@
|
5
|
10,471
|
26 Julio 2010, 13:50 pm
por Novlucker
|
|
|
hola bat que modifique el nombre de archivos de un directorio o carpeta
Scripting
|
binario010101
|
2
|
4,457
|
10 Agosto 2013, 16:38 pm
por binario010101
|
|
|
[SOLUCIONADO] Copiar carpeta de archivos con progresbar
Programación Visual Basic
|
e500
|
4
|
5,784
|
30 Diciembre 2014, 22:14 pm
por e500
|
|
|
Entrar desde MsDos a una carpeta según su nombre.
Windows
|
MaX2
|
4
|
5,050
|
17 Mayo 2016, 15:35 pm
por MaX2
|
|