VB Copiar archivos de una carpeta (listbox1 y 2) cambiando nombre desde un textb

Iniciado por mortygor, 3 Julio 2018, 18:19 PM

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

mortygor

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.


Eleкtro

Cita de: mortygor en  3 Julio 2018, 18:19 PM
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...

Código (vbnet) [Seleccionar]
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.








mortygor

Hola Elektro, lo primero muchas gracias por contestar, voy a probarlo y te cuento.

Muchas gracias y un saludo.

mortygor

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..

Eleкtro

Debes usar el botón específico que sirve para insertar código con formato...

Cita de: mortygor en  4 Julio 2018, 15:57 PMme 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









mortygor

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.
Código (vb) [Seleccionar]


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



mortygor

Código (vb) [Seleccionar]

        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



Eleкtro

CitarTe 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








Eleкtro

Primero de todo, te faltaba añadir estos imports:

Código (vbnet) [Seleccionar]
Imports System.Collections.ObjectModel
Imports System.Collections.Specialized





Segundo, todo este bloque:
Código (vbnet) [Seleccionar]
   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
       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\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
       For Each file In files
           ListBox1.Items.Add(file)

       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:

Código (vbnet) [Seleccionar]
   Private Sub NOMBRE_DEL_METODO()
       ...





La instrucción:
Código (vbnet) [Seleccionar]
Me.CheckForIllegalCrossThreadCalls = false

Debería ser así:
Código (vbnet) [Seleccionar]
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...

Código (vbnet) [Seleccionar]
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








mortygor

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.