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

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


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 2:04
Domenica, 18/06/2017
Ciao a tutti, stavo provando a fare un programma che usi la progressBar, quello che ho fatto va bene, ma c'è un problema, quando capita la copia di file lunghi la progressBar si ferma fino a che non viene terminata la copia del file.

Ho controllato in rete e ho provato ad adattarlo nel mio programma ma non mi ha funzionato nulla, volevo chiedervi se potevate darmi una mano o un consiglio su come agire.

Ecco il codice:
Codice sorgente - presumibilmente Delphi

  1. public Form1()
  2.         {
  3.             InitializeComponent();
  4.             backgroundWorker1.WorkerReportsProgress = true;
  5.             backgroundWorker1.WorkerSupportsCancellation = true;
  6.         }
  7.  
  8.         private void GetFile(string source)
  9.         {
  10.             files = Directory.GetFiles(source, "*.*", System.IO.SearchOption.AllDirectories); //Legge tutti i file dalla directory passata
  11.             progressBar1.Maximum = files.Length; //Impostiamo come valore massimo della progressBar i bayte totali di tutti i file
  12.         }
  13.  
  14.         private void btnStart_Click(object sender, EventArgs e)
  15.         {
  16.             if (string.IsNullOrEmpty(txtSorgente.Text) || string.IsNullOrEmpty(txtDestinazione.Text))
  17.             {
  18.                 MessageBox.Show("Non hai selezionato la directory!", "Avviso", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  19.                 return;
  20.             }
  21.  
  22.             backgroundWorker1.RunWorkerAsync();
  23.             btnStart.Enabled = false;
  24.             btnCancella.Enabled = true;
  25.         }
  26.  
  27.         private void btnCancella_Click(object sender, EventArgs e)
  28.         {
  29.             backgroundWorker1.CancelAsync();
  30.             btnCancella.Enabled = false;
  31.             btnStart.Enabled = true;
  32.         }
  33.  
  34.         private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  35.         {
  36.             if (backgroundWorker1.CancellationPending)
  37.                 e.Cancel = true;
  38.             else
  39.             {
  40.                 string newDir = "";
  41.                 foreach (string f in files)
  42.                 {
  43.                     fi = new FileInfo(f);
  44.                     newDir = targetDir + "\\" + fi.DirectoryName.Substring(sourceDir.Length) + "\\";
  45.                     if (!Directory.Exists(newDir))
  46.                         Directory.CreateDirectory(newDir);
  47.  
  48.                     totaleFile += 1; //Conto i file
  49.                     nomeFile = "Copia file: " + f.Substring(0, 3) + "...\\" + fi.Name; // Preleva i nomi dei file
  50.  
  51.                     File.Copy(f, newDir + fi.Name, true); //Copio il file
  52.                     backgroundWorker1.ReportProgress(totaleFile);
  53.                 }
  54.             }
  55.         }
  56.  
  57.         private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
  58.         {
  59.             progressBar1.Value = e.ProgressPercentage;
  60.             lblPercentuale.Text = e.ProgressPercentage + " %";
  61.             lblTotaleFile.Text = "Totale file: " + totaleFile.ToString() + " di " + files.Length.ToString();
  62.             lblNomiFileProcessati.Text = nomeFile; // Mostro il nome dei file
  63.         }
  64.  
  65.         private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  66.         {
  67.             if (e.Cancelled)
  68.             {
  69.                 MessageBox.Show("La copia è stata interrotta!", "Avviso", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  70.                 btnCancella.Enabled = false;
  71.             }
  72.             else
  73.             {
  74.                 MessageBox.Show("Copiato con successo.", "Avviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
  75.                 btnStart.Enabled = true;
  76.                 btnCancella.Enabled = false;
  77.             }
  78.         }
  79.  
  80.         private void btnSorgente_Click(object sender, EventArgs e)
  81.         {
  82.             FolderBrowserDialog fbd = new FolderBrowserDialog();
  83.             if(fbd.ShowDialog() == DialogResult.OK)
  84.             {
  85.                 txtSorgente.Text = fbd.SelectedPath;
  86.                 sourceDir = txtSorgente.Text;
  87.                 GetFile(sourceDir);
  88.             }
  89.         }
  90.  
  91.         private void btnDestinazione_Click(object sender, EventArgs e)
  92.         {
  93.             FolderBrowserDialog fbd = new FolderBrowserDialog();
  94.             if (fbd.ShowDialog() == DialogResult.OK)
  95.             {
  96.                 txtDestinazione.Text = fbd.SelectedPath;
  97.                 targetDir = txtDestinazione.Text;
  98.             }
  99.         }




Grazie.

Ultima modifica effettuata da lupetto77 il 18/06/2017 alle 16:42
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6388
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 8:28
Domenica, 18/06/2017
Perché costringi a scaricare tutto il tuo progetto?

Posta semplicemente la parte di codice che ritieni utile farci leggere, qui nel forum, e si dà un'occhiata.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 16:45
Domenica, 18/06/2017
Ho corretto il primo post come mi hai detto, ho postato il codice.
Scusa ma pensavo che era meglio con il progetto.
Grazie per la risposta.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6388
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:16
Domenica, 18/06/2017
La barra conta i file quindi è ovvio che la barra si sposti quando il file è completato.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 0:46
Lunedì, 19/06/2017
Grazie per l'aiuto nessuno

lo so che conta i file, ma siccome con tutte le prove che ho fatto non risciuvo allora ho postato il codice pulito.

Comunque ora ti posto i passi che sto eseguendo cosi se sbaglio qualcosa puoi consigliarmi su come agire sempre se hai il tempo ovviamente.
Ho aggiunto un metodo che mi salva tutti i bytesTotali della directory sorgente in una variabile long.
Penso cosi va bene:
Codice sorgente - presumibilmente C#

  1. void PrelevaDimensioneTotaleFile(string dir)
  2.         {
  3.             string[] allFiles = Directory.GetFiles(dir);
  4.             foreach (string file in allFiles)
  5.                 bytesTotali += file.Length;
  6.  
  7.             string[] allDirectory = Directory.GetDirectories(dir);
  8.             foreach (string subDirectory in allDirectory)
  9.                 PrelevaDimensioneTotaleFile(subDirectory);
  10.         }



poi ho modificato il metodo GetFile cosi:
Codice sorgente - presumibilmente C# / VB.NET

  1. private void GetFile(string source)
  2. {
  3.    files = Directory.GetFiles(source, "*.*", System.IO.SearchOption.AllDirectories); //Legge tutti i file dalla directory passata
  4.    progressBar1.Value = 0;
  5.    progressBar1.Maximum = (int)bytesTotali; //Impostiamo come valore massimo della progressBar i bayte totali di tutti i file
  6. }




Nel metodo: backgroundWorker1_DoWork ho aggiunto:
Codice sorgente - presumibilmente C# / VB.NET

  1. int tmpBytes = Convert.ToInt32((((progressBar1.Value) / (progressBar1.Maximum)) * 100));


e il ReportProgress invece di passare totaleFile ho passato la variabile sopra tmpBytes
Codice sorgente - presumibilmente Plain Text

  1. backgroundWorker1.ReportProgress(tmpBytes);



Ma non parte la progressBar.

Qui mi sono bloccato non so come fare, hai suggerimenti?
Intanto faccio altre prove, grazie ancora.


Ultima modifica effettuata da lupetto77 il 19/06/2017 alle 18:54
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6388
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:27
Lunedì, 19/06/2017
Intanto si scrive "hai" ... l'italiano prima del VB ...

Per la tua questione è un problema a monte ... se usi la File.Copy ovviamente non potrai mai avere il numero di byte man mano che viene copiato un file. Devi usare gli Stream per leggere e scrivere i file pezzo per pezzo e inviare tale informazione alla progress bar.

Se vuoi, puoi anche usare il metodo My.Computer.FileSystem.CopyFile con le opzioni per la UI (vedi help) che ti permettono di visualizzare la progress bar di sistema.



Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 16:13
Lunedì, 19/06/2017
Lo so che si scrive hai, ma ho la tastiera wireless che ogni tanto non mi digita, comunque non sono qui per l'italiano.
L'errore è stato corretto.

Ok proverò con gli Stream.

My.Computer.FileSystem.CopyFile ti apre una nuova schermata con la copia dei file.
Io voglio usare la progressBar che ho integrato.

Grazie per la risposta.

Ultima modifica effettuata da lupetto77 il 19/06/2017 alle 17:21
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6388
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:45
Lunedì, 19/06/2017
Testo quotato

Postato originariamente da lupetto77:

Lo so che si scrive hai, ma ho la tastiera wireless che ogni tanto non mi digita



Solo le h di hai non digita ... :-)  Ci sono due errori ... uguali ... ecco perché li ho segnalati ...

Testo quotato

comunque non sono qui per l'italiano.



Beh, questo non vuol dire che io non possa tenere alla nostra lingua !


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 18:57
Lunedì, 19/06/2017
Quando si va di corsa può capitare, cercherò di stare più attento la prossima volta.
Se non vado di corsa :D
Comunque è meglio finirla qui, che non serve a nulla parlare di questo, anche perchè non è un forum di lingue che io sappia :D

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