Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    130

    [VB.NET] Copiare file da cartella

    Salve, a tutti, ho scritto una Sub che permette di copiare dei file da una cartella selezionata dall'utente in un'altra cartella del programma, in pratica devo eseguire una importazione file.

    Il codice quindi apre una finestra di dialogo, per scegliere la cartella da dove prelevare i file, e una volta cliccato su ok, copia tutti i file nella cartella di destinazione

    codice:
     Dim Sorgente As New FolderBrowserDialog
     Dim elenco() as string
     Dim Destinazione as string
     Dim Nomefile as string
     Dim elementi() as string
    
    ' imposto la cartella di destinazione
     Destinazione="Percorso mia cartella"
    
    'textbox per verifiche
    TextBox1.text="1"
    
     'apro la finestra di dialogo per scegliere la cartella, e attendo il clcik su ok     
     If Sorgente.ShowDialog = Windows.Forms.DialogResult.OK Then
    
    'textbox per verifiche
    TextBox1.text="2"
    
    
    'riempo l'array elenco con tutti i percorsi dei file contenuti nella cartella
     elenco = Directory.GetFiles(Sorgente.SelectedPath)
    
    'textbox per verifiche
    TextBox1.text="3"
     
    
    'cilco for che spazzola tutto l'array elenco           
     For Each x As String In elenco   
    
    'textbox per verifiche
    TextBox1.text="4"
    
    
    'quà mi sono inventato una modo per estrapolare il nome di ogni file
     elementi = Split(x, "\")              
     Nomefile = elementi(elementi.Length - 1)
    
    'copio il file dalla cartella scelta, alla cartella di destinazione              
     File.Copy(Sorgente.SelectedPath & "\" & Nomefile, Destinazione & "\" & Nomefile)
    
     Next 
    'textbox per verifiche
    textBox1.text="5"
    Il codice funziona, e riesco a copiare tutti file.
    Il problema è che quando i file iniziano ad essere parecchi, il computer impiega del tempo a svolgere tutta l'operazione, già con 50 file impiega circa 15 secondi.

    Quindi volevo far apparire un messaggio che avvisa l'utente di attendere la fine dell'operazione, ancora meglio una barra di caricamento, ma già il messaggio andrebbe bene.

    Però subito dopo aver cliccato ok il computer è come bloccato per una quindicina di secondi, fino a quando non finisce l'operazione.
    Ho infatti aggiunto una TextBox1, e cambio il suo text man mano che il codice procede, per capire dove è che si inchioda.

    Quando eseguo il codice, succede che sulla textbox compare giustamente 1, si apre la finestra di dialogo, scelgo la cartella, e clicco ok. A quel punto dovrebbe comparire 2, successivamente 3 , e 4, e poi alla fine 5, invece il computer è come bloccato per una quindicina di secondi, e poi compare subito il numero 5 sulla textbox.

    Cioè dopo aver cliccato ok, non fà nemmeno in tempo a scrivere 2 sulla casella di testo, e quindi non fà nemmeno in tempo ad eseguire qualsiasi altra cosa, come il far apparire una finestra.
    Però il codice viene eseguito correttamente perchè tutti i file vengono copiati senza problemi.

    Ora chiedo se c'è una possibile soluzione a questa cosa, perchè così anche se funzionante, non può andare, l'utente non vedendo apparire nulla, e vedendo il programma bloccato, per diverso tempo, potrebbe interrompere l'esecuzione con il CTRL ALT CANC, ancora prima che il software abbia finito di copiare tutti i file.

    Ringrazio tutti per la disponibilità

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    130
    Assurdo, ho provato anche ad inserire una pausa di 1 secondo dopo l'ok e dopo il comando Textbox2.text="2" con il comando

    Threading.Thread.Sleep(1000)

    ma nulla, il programma copia tutti i file, ma non fà altro.

  3. #3
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Basta usare l'apposita funzione di sistema

    Documentati su SHFileOperation


  4. #4
    Non c'è nulla di così assurdo, se in un gestore di eventi di un'applicazione Windows esegui del codice che impiega un tempo notevole a completare la GUI resta inchiodata, dato che il singolo thread della tua applicazione non può contemporaneamente eseguire la tua operazione e stare dietro agli eventi della finestra.
    Non a caso per le operazioni lunghe normalmente si avvia un thread separato (oppure si ricorre alla triste soluzione dell'Application.DoEvents per processare gli eventi pendenti di tanto in tanto).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    130
    Ma se in quei 15 secondi esegue il cilo for each , quindi esegue le istruzione per elaborare il nome, e l'indirizzo del file, esegue l'istruzione per copiare il file, dovrebbe eseguire anche le altre istruzioni che ci stanno in mezzo al codice.


    Comunque ho risolto inserendo in mezzo al ciclo for queste 2 istruzioni
    Application.DoEvents()
    System.Threading.Thread.Sleep(1)

    In questo modo riesco pure ad incrementare una variabile, e quindi a visualizzare la percentuale di caricamento.

    Grazie a tutti per la disponibilità.

  6. #6
    Originariamente inviato da jasson
    Ma se in quei 15 secondi esegue il cilo for each , quindi esegue le istruzione per elaborare il nome, e l'indirizzo del file, esegue l'istruzione per copiare il file, dovrebbe eseguire anche le altre istruzioni che ci stanno in mezzo al codice.
    Le esegue, ma aggiornare una textbox non implica un ridisegno; anche se forzi ridisegno della textbox comunque tutta la gestione dei messaggi di finestra è ferma, per cui tutto quello che ottieni è che (forse) cambia la textbox e tutto il resto dell'interfaccia resta bloccata.
    Ribadisco, la soluzione più corretta è usare un thread separato (avendo cura di usare Control.Invoke per manipolare la GUI dall'altro thread, dato che i controlli Windows Forms non sono thread-safe, oppure usare un BackgroundWorker, che dovrebbe gestire la faccenda in maniera anche più semplice).
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.