Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Copia file
Forum - C# / VB.NET - Copia file - Pagina 4

Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 18:56
Domenica, 25/06/2017
Ciao Thejuster ho provato a richiamare la funzione anche cosi:
Codice sorgente - presumibilmente Plain Text

  1. await CopyFiles.CopyToWithProgressAsync(SourceReader, DestinationWriter, 4096, progress => progressBar1.Value = (int)progress);


e anche cosi:
Codice sorgente - presumibilmente Plain Text

  1. await SourceReader.CopyToWithProgressAsync(DestinationWriter, 4096, amtCopied => progressBar1.Value = (int)amtCopied);



Ma sempre questa eccezione:
Codice sorgente - presumibilmente Plain Text

  1. System.Reflection.TargetInvocationException: 'Eccezione generata dalla destinazione di una chiamata.'
  2.  
  3. Eccezione interna
  4. ArgumentOutOfRangeException: '1195757568' non è un valore valido per 'Value'. 'Value' deve essere compreso tra 'minimum' e 'maximum'.




PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 8:31
Lunedì, 26/06/2017
L'errore parla chiaro


ArgumentOutOfRangeException

Out of range,  c'è sempre un problema relativo al calcolo della prograssbar.
il valore supera quello impostato in massimo.

devi controllare bene il calcolo


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 17:57
Martedì, 27/06/2017
Ciao Thejuster scusami se non ti ho risposto subito, ma stavo facendo delle prove per risolvere il problema.

Ti posto il codice che sembrava funzionare:
Codice sorgente - presumibilmente C#

  1. private async void btnCopy_Click(object sender, EventArgs e)
  2.         {
  3.             //backgroundWorker1.RunWorkerAsync();
  4.  
  5.             string newDir = "";
  6.             foreach (string file in files)
  7.             {
  8.                 fi = new FileInfo(file);
  9.                 newDir = txtDestination.Text + "\\" + fi.DirectoryName.Substring(txtSource.Text.Length) + "\\";
  10.                 if (!Directory.Exists(newDir))
  11.                     Directory.CreateDirectory(newDir);
  12.  
  13.                 using (Stream SourceReader = File.Open(file, FileMode.Open))
  14.                 {
  15.                     using (Stream DestinationWriter = File.Create(newDir + fi.Name))
  16.                     {
  17.                         await SourceReader.CopyToWithProgressAsync(DestinationWriter, 4096, amtCopied => progressBar1.Value = (int)Math.Round(((double)amtCopied / (double)totalBytes * (double)100)));
  18.                     }
  19.                 }
  20.             }
  21.  
  22.             MessageBox.Show("File copiati con successo!");
  23.         }



Codice nella classe:
Codice sorgente - presumibilmente C++

  1. static class CopyFiles
  2.     {
  3.         public static async Task CopyToWithProgressAsync(this Stream source, Stream destination, int bufferSize = 4096, Action<long> progress = null)
  4.         {
  5.             var buffer = new byte[bufferSize];
  6.             var total = 0L;
  7.             int amtRead;
  8.             do
  9.             {
  10.                 amtRead = 0;
  11.                 while (amtRead < bufferSize)
  12.                 {
  13.                     var numBytes = await source.ReadAsync(buffer, amtRead, bufferSize - amtRead);
  14.                     if (numBytes == 0)
  15.                     {
  16.                         break;
  17.                     }
  18.                     amtRead += numBytes;
  19.                 }
  20.                 total += amtRead;
  21.                 await destination.WriteAsync(buffer, 0, amtRead);
  22.                 if (progress != null)
  23.                 {
  24.                     progress(total);
  25.                 }
  26.             } while (amtRead == bufferSize);
  27.         }
  28.     }



Il conteggio sembrava essere risolto con l'uso di Math.Round nel modo che ho usato sopra, ho provato anche con Math.Truncate la copia dei file viene effettuata con successo e la progressBar avanza.
Ho provato con una cartella che usavo di prova ed era finita correttamente anche la progressBar, ma era solo un illusione, infatti passando un'altra cartella si vede che ad ogni file la progressBar ricomincia sempre da 0.
Non so più cosa devo fare ti  prego aiutami :hail:

Ultima modifica effettuata da lupetto77 il 27/06/2017 alle 23:15
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 16:09
Giovedì, 29/06/2017
Ok dai e ora dunque di svelare l'arcano.
siccome non ci sei riuscito ma ho visto che la volontà ci stava
( Altrimenti sti cavoli che ti scrivevo la soluzione ed il codice :rotfl: )
Ti spiego dove sbagliavi e come fare.

Anche perché normalmente sul forum aiutiamo veramente a chi ci mostra che
sta brancolando nel buio o è in difficoltà.

Il tuo metodo poteva andare bene ma preferisco un approccio diverso
senza utilizzare Thread paralleli o altre cose del genere.

La logica del discorso è questa.

1° Ottengo tutti i bytes da copiare di tutti i file facendo un ciclo ricorsivo
    ed incrementando una variabile pubblica

2° Inizio un ciclo di copia


Siccome ti avevo ripetuto tipo 100 volte che il tuo calcolo era sbagliato.
ti spiego il perché.

Perché la copia viene effettuata in Kilobyte e non in byte.
un byte è 255  un kilobyte 1024

quindi si fà

copiato / 1024 (Kilobyte)

e giustamente ( OutOfRange ) ci sta ed ha pure ragione...

Dunque come fare?


Codice sorgente - presumibilmente C#

  1. //Variabili pubbliche
  2.         int maxbytes = 0;
  3.         int copiati = 0;
  4.         int totali = 0;
  5.         string source;
  6.         string dest;
  7.  
  8.  
  9.  
  10.       //Avvio del processo
  11.         private void button3_Click(object sender, EventArgs e)
  12.         {
  13.             DirectoryInfo diSource = new DirectoryInfo(source);
  14.             DirectoryInfo diTarget = new DirectoryInfo(dest);
  15.            
  16.             //Creo un ciclo veloce per recuperare
  17.             //prima tutti i bytes totali di tutti i file contenuti
  18.             //nelle cartelle e sottocartelle, la funzione è un ciclo
  19.             //che man mano incrementa la variabiale maxbytes.
  20.             GetSize(diSource, diTarget);  
  21.             maxbytes = maxbytes / 1024;
  22.  
  23.             progressBar1.Maximum = maxbytes;
  24.             Copia(label4, progressBar1, diSource, diTarget);
  25.  
  26.  
  27.             MessageBox.Show("Completato...");
  28.         }
  29.  
  30.  
  31.  
  32.  
  33.  
  34.          /// <summary>
  35.         /// Funzione Copia Tutto
  36.         /// </summary>
  37.         /// <param name="lable1">Label su cui applicare le modifiche</param>
  38.         /// <param name="progressBar1">Progressbar su cui applicare le modifiche</param>
  39.         /// <param name="source">Cartella sorgente</param>
  40.         /// <param name="target">Cartella di destinazione</param>
  41.         public void Copia(Label lable1, ProgressBar progressBar1, DirectoryInfo source, DirectoryInfo target)
  42.         {
  43.  
  44.             if (Directory.Exists(target.FullName) == false)
  45.             {
  46.                 Directory.CreateDirectory(target.FullName);
  47.             }
  48.             foreach (FileInfo fi in source.GetFiles())
  49.             {
  50.  
  51.                 fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);
  52.  
  53.                 totali += (int)fi.Length;
  54.  
  55.                 copiati += (int)fi.Length;
  56.                 copiati /= 1024;
  57.                 progressBar1.Step = copiati;
  58.                 progressBar1.PerformStep();
  59.  
  60.                 lable1.Text = (totali / 1024).ToString() + "KB di " + maxbytes.ToString() + "KB copiati";
  61.                 lable1.Refresh();
  62.  
  63.             }
  64.             foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
  65.             {
  66.                 DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name);
  67.                 Copia(lable1, progressBar1, diSourceSubDir, nextTargetSubDir);
  68.             }
  69.  
  70.         }
  71.  
  72.  
  73.  
  74.  
  75.  
  76.          /// <summary>
  77.         /// Funzione iniziale utilizzata per il recupero e successivamente
  78.         /// per la grandezza dei files
  79.         /// </summary>
  80.         /// <param name="source">cartella di sorgente</param>
  81.         /// <param name="target">cartella di destinazione</param>
  82.         public void GetSize(DirectoryInfo source, DirectoryInfo target)
  83.         {
  84.             foreach (FileInfo fi in source.GetFiles())
  85.             {
  86.                 maxbytes += (int)fi.Length;
  87.             }
  88.             foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
  89.             {
  90.                 DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name);
  91.                 GetSize(diSourceSubDir, nextTargetSubDir);
  92.             }
  93.         }




poi volendo puoi mettere tutto in un thread separato
ma assicurati di utilizzare invoke((Action)delegate { .... }   per le operazioni sia alla label
che alla progressBar.

Detto questo sei apposto così
Buona fortuna per il tuo progetto

Ultima modifica effettuata da Thejuster il 29/06/2017 alle 16:12


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 0:12
Venerdì, 30/06/2017
Ciao Thejuster e grazie infinitamente per l'aiuto.

Stavo provando da un po il codice, siccome copia tutti i file ma non si avvia la progressBar e la finestra rimane bloccata, solo dopo la fine della copia mostra la progressBar piena con la MessageBox i completamento.
Stavo facendo delle prove e sono queste:

Una domanda prima, perche' usi la label4 nel button3?
Non so cos'è la label4, ma immagino che si poteva passare la labe1 giusto?

Premetto che ho provato con il backgroundWorker pensando che era più facile, ma non ci sono riuscito.
Allora ho provato a creare una classe sempre basandomi su il tuo codice:
Codice sorgente - presumibilmente C++

  1. static class CopyFilesAsync
  2.     {
  3.         public static int maxbytes { get; set; } = 0;
  4.         public static int copiati { get; set; } = 0;
  5.         public static int totali { get; set; } = 0;
  6.  
  7.         /// <summary>
  8.         /// Funzione Copia Tutto
  9.         /// </summary>
  10.         /// <param name="lable1">Label su cui applicare le modifiche</param>
  11.         /// <param name="progressBar1">Progressbar su cui applicare le modifiche</param>
  12.         /// <param name="source">Cartella sorgente</param>
  13.         /// <param name="target">Cartella di destinazione</param>
  14.         public static async Task Copia(Label label1, ProgressBar progressBar1, DirectoryInfo source, DirectoryInfo target, Action<int> progress = null, Action<string> label = null)
  15.         {
  16.             //Controllo se esiste la directory di destinazione altrimenti la creo
  17.             if (Directory.Exists(target.FullName) == false)
  18.             {
  19.                 Directory.CreateDirectory(target.FullName);
  20.             }
  21.  
  22.             foreach (FileInfo fi in source.GetFiles())
  23.             {
  24.                 fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);
  25.  
  26.                 totali += (int)fi.Length;
  27.  
  28.                 copiati += (int)fi.Length;
  29.                 copiati /= 1024;
  30.                 //progressBar1.Step = copiati;
  31.                 //progressBar1.PerformStep();
  32.  
  33.                 //label1.Text = (totali / 1024).ToString() + "KB di " + maxbytes.ToString() + "KB copiati";
  34.                 //label1.Refresh();
  35.  
  36.                 if (progress != null)
  37.                 {
  38.                     progress(copiati);
  39.                 }
  40.                
  41.                 if(label != null)
  42.                 {
  43.                     label((totali / 1024).ToString() + "KB di " + maxbytes.ToString() + "KB copiati");
  44.                 }
  45.             }
  46.  
  47.             foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
  48.             {
  49.                 DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name);
  50.                 await Copia(label1, progressBar1, diSourceSubDir, nextTargetSubDir, progress, label);
  51.             }
  52.         }
  53.     }



Nel form principale:
Codice sorgente - presumibilmente C#

  1. //Variabili pubbliche
  2. string source;
  3. string dest;
  4.  
  5. /// <summary>
  6.         /// Funzione iniziale utilizzata per il recupero e successivamente
  7.         /// per la grandezza dei files
  8.         /// </summary>
  9.         /// <param name="source">cartella di sorgente</param>
  10.         /// <param name="target">cartella di destinazione</param>
  11.         public void GetSize(DirectoryInfo source, DirectoryInfo target)
  12.         {
  13.             foreach (FileInfo fi in source.GetFiles())
  14.             {
  15.                 CopyFilesAsync.maxbytes += (int)fi.Length;
  16.             }
  17.  
  18.             foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
  19.             {
  20.                 DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name);
  21.                 GetSize(diSourceSubDir, nextTargetSubDir);
  22.             }
  23.         }
  24.  
  25. private void btnSource_Click(object sender, EventArgs e)
  26.         {
  27.             FolderBrowserDialog fbd = new FolderBrowserDialog();
  28.             if(fbd.ShowDialog() == DialogResult.OK)
  29.             {
  30.                 source = fbd.SelectedPath;
  31.                 txtSource.Text = source;
  32.             }
  33.         }
  34.  
  35.         private void btnDestination_Click(object sender, EventArgs e)
  36.         {
  37.             FolderBrowserDialog fbd = new FolderBrowserDialog();
  38.             if (fbd.ShowDialog() == DialogResult.OK)
  39.             {
  40.                 dest = fbd.SelectedPath;
  41.                 txtDestination.Text = dest;
  42.             }
  43.         }
  44.  
  45. //Avvio del processo
  46.         private async void btnCopia_Click(object sender, EventArgs e)
  47.         {
  48.             DirectoryInfo diSource = new DirectoryInfo(source);
  49.             DirectoryInfo diTarget = new DirectoryInfo(dest);
  50.  
  51.             //Creo un ciclo veloce per recuperare
  52.             //prima tutti i bytes totali di tutti i file contenuti
  53.             //nelle cartelle e sottocartelle, la funzione è un ciclo
  54.             //che man mano incrementa la variabiale maxbytes.
  55.             GetSize(diSource, diTarget);
  56.             CopyFilesAsync.maxbytes = CopyFilesAsync.maxbytes / 1024;
  57.  
  58.             progressBar1.Maximum = CopyFilesAsync.maxbytes;
  59.             await CopyFilesAsync.Copia(label2, progressBar1, diSource, diTarget, progress => progressBar1.Step = progress, label => label1.Text = label);
  60.             progressBar1.PerformStep();
  61.             label1.Refresh();
  62.  
  63.             MessageBox.Show("Completato...");
  64.  
  65.             //backgroundWorker1.RunWorkerAsync();
  66.         }



Stesso risultato, copia tutti i file ma la progressBar non avanza e la finestra rimane bloccata.

Ultima modifica effettuata da lupetto77 il 30/06/2017 alle 1:33
PM Quote
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 0:31
Venerdì, 30/06/2017
Ti mostro anche la prove con il backgroundWorker1

Codice sorgente - presumibilmente C# / VB.NET

  1. Codice sorgente - presumibilmente C# / VB.NET

           
  2.         /// <summary>
  3.         /// Funzione Copia Tutto
  4.         /// </summary>
  5.         /// <param name="lable1">Label su cui applicare le modifiche</param>
  6.         /// <param name="progressBar1">Progressbar su cui applicare le modifiche</param>
  7.         /// <param name="source">Cartella sorgente</param>
  8.         /// <param name="target">Cartella di destinazione</param>
  9.         public void Copia(Label label1, ProgressBar progressBar1, DirectoryInfo source, DirectoryInfo target)
  10.         {
  11.             //Controllo se esiste la directory di destinazione altrimenti la creo
  12.             if (Directory.Exists(target.FullName) == false)
  13.             {
  14.                 Directory.CreateDirectory(target.FullName);
  15.             }
  16.  
  17.             foreach (FileInfo fi in source.GetFiles())
  18.             {
  19.  
  20.                 fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);
  21.  
  22.                 totali += (int)fi.Length;
  23.  
  24.                 copiati += (int)fi.Length;
  25.                 copiati /= 1024;
  26.                 //progressBar1.Step = copiati;
  27.                 //progressBar1.PerformStep();
  28.  
  29.                 backgroundWorker1.ReportProgress(copiati);
  30.  
  31.                 //label1.Text = (totali / 1024).ToString() + "KB di " + maxbytes.ToString() + "KB copiati";
  32.                 //label1.Refresh();
  33.             }
  34.  
  35.             foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
  36.             {
  37.                 DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name);
  38.                 Copia(label1, progressBar1, diSourceSubDir, nextTargetSubDir);
  39.             }
  40.         }
  41.  
  42.  
  43.         /// <summary>
  44.         /// Funzione iniziale utilizzata per il recupero e successivamente
  45.         /// per la grandezza dei files
  46.         /// </summary>
  47.         /// <param name="source">cartella di sorgente</param>
  48.         /// <param name="target">cartella di destinazione</param>
  49.         public void GetSize(DirectoryInfo source, DirectoryInfo target)
  50.         {
  51.             foreach (FileInfo fi in source.GetFiles())
  52.             {
  53.                 maxbytes += (int)fi.Length;
  54.             }
  55.  
  56.             foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
  57.             {
  58.                 DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name);
  59.                 GetSize(diSourceSubDir, nextTargetSubDir);
  60.             }
  61.         }
  62.  
  63.  
  64.         private void btnSource_Click(object sender, EventArgs e)
  65.         {
  66.             FolderBrowserDialog fbd = new FolderBrowserDialog();
  67.             if(fbd.ShowDialog() == DialogResult.OK)
  68.             {
  69.                 source = fbd.SelectedPath;
  70.                 txtSource.Text = source;
  71.             }
  72.         }
  73.  
  74.  
  75.         private void btnDestination_Click(object sender, EventArgs e)
  76.         {
  77.             FolderBrowserDialog fbd = new FolderBrowserDialog();
  78.             if (fbd.ShowDialog() == DialogResult.OK)
  79.             {
  80.                 dest = fbd.SelectedPath;
  81.                 txtDestination.Text = dest;
  82.             }
  83.         }
  84.  
  85.  
  86.         //Avvio del processo
  87.         private void btnCopia_Click(object sender, EventArgs e)
  88.         {
  89.             backgroundWorker1.RunWorkerAsync();
  90.         }
  91.  
  92.  
  93.         private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  94.         {
  95.             DirectoryInfo diSource = new DirectoryInfo(source);
  96.             DirectoryInfo diTarget = new DirectoryInfo(dest);
  97.  
  98.             //Creo un ciclo veloce per recuperare
  99.             //prima tutti i bytes totali di tutti i file contenuti
  100.             //nelle cartelle e sottocartelle, la funzione è un ciclo
  101.             //che man mano incrementa la variabiale maxbytes.
  102.             GetSize(diSource, diTarget);
  103.             maxbytes = maxbytes / 1024;
  104.  
  105.             progressBar1.Maximum = maxbytes;
  106.             Copia(label2, progressBar1, diSource, diTarget);
  107.  
  108.             MessageBox.Show("Completato...");
  109.         }
  110.  
  111.  
  112.         private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
  113.         {
  114.             Invoke((Action)delegate
  115.             {
  116.                 progressBar1.Step = copiati;
  117.                 progressBar1.PerformStep();
  118.  
  119.                 label1.Text = (totali / 1024).ToString() + "KB di " + maxbytes.ToString() + "KB copiati";
  120.                 label1.Refresh();
  121.             });
  122.         }



Nella funzione Copia con questa riga:
Codice sorgente - presumibilmente Plain Text

  1. Codice sorgente - presumibilmente Plain Text

    backgroundWorker1.ReportProgress(copiati);



Vengono create solo due cartelle vuote e la progressBar e la label1 non avanzano.

Poi ho provato cosi:
Nell'evento ProgressChanged impostato cosi:
Codice sorgente - presumibilmente C# / VB.NET

  1. Codice sorgente - presumibilmente C# / VB.NET

  2.         private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
  3.         {
  4.             Invoke((Action)delegate
  5.             {
  6.                 progressBar1.Value = e.ProgressPercentage;
  7.             });
  8.         }




e nella funzione Copia:
Codice sorgente - presumibilmente C# / VB.NET

  1. Codice sorgente - presumibilmente C# / VB.NET

  2.         /// <summary>
  3.         /// Funzione Copia Tutto
  4.         /// </summary>
  5.         /// <param name="lable1">Label su cui applicare le modifiche</param>
  6.         /// <param name="progressBar1">Progressbar su cui applicare le modifiche</param>
  7.         /// <param name="source">Cartella sorgente</param>
  8.         /// <param name="target">Cartella di destinazione</param>
  9.         public void Copia(Label label1, ProgressBar progressBar1, DirectoryInfo source, DirectoryInfo target)
  10.         {
  11.             //Controllo se esiste la directory di destinazione altrimenti la creo
  12.             if (Directory.Exists(target.FullName) == false)
  13.             {
  14.                 Directory.CreateDirectory(target.FullName);
  15.             }
  16.  
  17.             foreach (FileInfo fi in source.GetFiles())
  18.             {
  19.  
  20.                 fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);
  21.  
  22.                 totali += (int)fi.Length;
  23.  
  24.                 copiati += (int)fi.Length;
  25.                 copiati /= 1024;
  26.                
  27.                 Invoke((Action)delegate
  28.                 {
  29.                     progressBar1.Step = copiati;
  30.                     progressBar1.PerformStep();
  31.  
  32.                     label1.Text = (totali / 1024).ToString() + "KB di " + maxbytes.ToString() + "KB copiati";
  33.                     label1.Refresh();
  34.                 });
  35.             }
  36.  
  37.             foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
  38.             {
  39.                 DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name);
  40.                 Copia(label1, progressBar1, diSourceSubDir, nextTargetSubDir);
  41.             }
  42.         }




Si muove la finestra ma non copia e avanza la progressBar.

Scusami ancora ma ci sto provando e non ci riesco a far funzionare questa maledetta progressBar:grr:

Ultima modifica effettuata da lupetto77 il 30/06/2017 alle 0:34
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 10:54
Venerdì, 30/06/2017
Non so cosa dirti lol.
Da me ha funzionato anche senza il background worker.

Ho testato su xp.

Quando torno da lavoro lo provo su win7 e ti faccio sapere

Edit:

Intanto prova sempre con i delegati avviando un thread anziché un Background worker.
Ho appena testato e funziona

https://s1.postimg.org/3ruzte6rj/Immagine.png



Codice sorgente - presumibilmente C++

  1. //Avvio del processo
  2.         private void button3_Click(object sender, EventArgs e)
  3.         {
  4.             DirectoryInfo diSource = new DirectoryInfo(source);
  5.             DirectoryInfo diTarget = new DirectoryInfo(dest);
  6.            
  7.             //Creo un ciclo veloce per recuperare
  8.             //prima tutti i bytes totali di tutti i file contenuti
  9.             //nelle cartelle e sottocartelle, la funzione è un ciclo
  10.             //che man mano incrementa la variabiale maxbytes.
  11.             GetSize(diSource, diTarget);  
  12.             maxbytes = maxbytes / 1024;
  13.  
  14.             progressBar1.Maximum = maxbytes;
  15.             Thread t = new Thread(() => Copia(label4, progressBar1, diSource, diTarget));
  16.             //Copia(label4, progressBar1, diSource, diTarget);
  17.             t.Start();
  18.  
  19.  
  20.             //MessageBox.Show("Completato...");
  21.            
  22.         }
  23.  
  24.  
  25.  
  26.  
  27.  /// <summary>
  28.         /// Funzione Copia Tutto
  29.         /// </summary>
  30.         /// <param name="lable1">Label su cui applicare le modifiche</param>
  31.         /// <param name="progressBar1">Progressbar su cui applicare le modifiche</param>
  32.         /// <param name="source">Cartella sorgente</param>
  33.         /// <param name="target">Cartella di destinazione</param>
  34.         public void Copia(Label lable1, ProgressBar progressBar1, DirectoryInfo source, DirectoryInfo target)
  35.         {
  36.  
  37.             if (Directory.Exists(target.FullName) == false)
  38.             {
  39.                 Directory.CreateDirectory(target.FullName);
  40.             }
  41.             foreach (FileInfo fi in source.GetFiles())
  42.             {
  43.                 Invoke((Action)delegate
  44.                 {
  45.                     fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);
  46.  
  47.                     totali += (int)fi.Length;
  48.  
  49.                     copiati += (int)fi.Length;
  50.                     copiati /= 1024;
  51.                     progressBar1.Step = copiati;
  52.                     progressBar1.PerformStep();
  53.  
  54.                     lable1.Text = (totali / 1024).ToString() + "KB di " + maxbytes.ToString() + "KB copiati";
  55.                     lable1.Refresh();
  56.                 });
  57.             }
  58.             foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
  59.             {
  60.                 DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name);
  61.                 Copia(lable1, progressBar1, diSourceSubDir, nextTargetSubDir);
  62.             }
  63.  
  64.         }
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  /// <summary>
  71.         /// Funzione iniziale utilizzata per il recupero e successivamente
  72.         /// per la grandezza dei files
  73.         /// </summary>
  74.         /// <param name="source">cartella di sorgente</param>
  75.         /// <param name="target">cartella di destinazione</param>
  76.         public void GetSize(DirectoryInfo source, DirectoryInfo target)
  77.         {
  78.             foreach (FileInfo fi in source.GetFiles())
  79.             {
  80.                 maxbytes += (int)fi.Length;
  81.             }
  82.             foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
  83.             {
  84.                 DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name);
  85.                 GetSize(diSourceSubDir, nextTargetSubDir);
  86.             }
  87.         }




Ultima modifica effettuata da Thejuster il 30/06/2017 alle 14:33


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 17:42
Venerdì, 30/06/2017
Ciao Thejuster ho tolto il backgroundworker e provato come mi hai suggerito, e sembra andare bene con cartelle di piccole dimensioni perchè provando a copiare una cartella di 15gb ma anche un unico file da 5gb mi da questa eccezione:
(ovviamente cambia solo la dimensione '-1597523')
Codice sorgente - presumibilmente Plain Text

  1. System.ArgumentOutOfRangeException: ''-1597523' non è un valore valido per 'Maximum'. 'Maximum' deve essere maggiore o uguale a 0.'



Non vuole proprio saperne di funzionare la maledetta :grr:

Ultima modifica effettuata da lupetto77 il 30/06/2017 alle 18:20
PM Quote
Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo