Thread + progressbar + background worker
Bonjour,
J'ai besoin de faire une copie d'un dossier avec progressbar
je lance la copie via un bouton
Code:
1 2 3 4 5 6 7 8 9 10 11
| private void button1_Click(object sender, EventArgs e)
{
// je cherche la taille totale de mon repertoire -> taille max de ma progressbar
DirectoryInfo dvd = new DirectoryInfo(main.DVD);
Int32 taille_tot = Convert.ToInt32(config.Taille_rep(dvd) / main.BufferSize);
progressBar.Maximum = taille_tot;
// début de la copie du repertoire
label_etape.Text = "Copie des fichiers du DVD";
Copie.copie_DVD(main.DVD, main.rep_Sources, progressBar);
label_etape.Text = "Copie terminée";
} |
Pour la copie j'utilise :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
public class Copie
{
public static void copie_fichier(string f_a_copier, string f_destination, ProgressBar progressbar)
{
try
{
System.Diagnostics.Stopwatch stop = System.Diagnostics.Stopwatch.StartNew();
using (FileStream inputStream = File.OpenRead(f_a_copier))
{
using (FileStream outputStream = File.OpenWrite(f_destination))
{
byte[] bufferWork = new byte[main.BufferSize];
byte[] bufferLoad = new byte[main.BufferSize];
byte[] bufferTmp;
IAsyncResult asyncResult;
int nbRead = inputStream.Read(bufferWork, 0, bufferWork.Length);
while (nbRead > 0)
{
asyncResult = inputStream.BeginRead(bufferLoad, 0, bufferLoad.Length, null, null);
outputStream.Write(bufferWork, 0, nbRead);
nbRead = inputStream.EndRead(asyncResult);
// j'incremente la progressbar
progressbar.PerformStep();
bufferTmp = bufferWork;
bufferWork = bufferLoad;
bufferLoad = bufferTmp;
}
}
}
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString(), "erreur", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
public static void copie_DVD(string dvd, string rep_dest, ProgressBar progressbar)
{
try
{
DirectoryInfo rep = new DirectoryInfo(dvd);
if (rep.Exists)
{
string vrai_rep_dest;
if (rep.Root.Name != rep.Name)
{
vrai_rep_dest = Path.Combine(rep_dest, rep.Name);
if (!Directory.Exists(vrai_rep_dest))
{ Directory.CreateDirectory(vrai_rep_dest); }
}
else
{ vrai_rep_dest = rep_dest; }
foreach (string d in Directory.GetDirectories(dvd))
Copie.copie_DVD(d, vrai_rep_dest,progressbar);
foreach (string fichier in Directory.GetFiles(dvd))
{
string fichier_dest = Path.Combine(vrai_rep_dest, Path.GetFileName(fichier));
copie_fichier(fichier, fichier_dest,progressbar);
}
}
}
catch (Exception)
{
MessageBox.Show(erreur.affiche_erreur(03), "Erreur ... ", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
}
} |
jusqu'ici tout fonctionne bien, ma barre progresse comme il faut.
maintenant j'aimerais rajouter un bouton annuler
si j'ai tout bien compris, pour ca je dois mettre ma copie de fichier dans un thread pour pouvoir utiliser le bouton annuler a n'importe quel moment
mais si je met ma copie dans un thread j'ai un conflit de threads a cause de la progressbar
donc, si j'ai encore bien compris il faudrait que j'utilise un backgroundworker sur la progressbar pour la faire avancer, le problème c'est que j'utilise un progressbar.PerformStep() et je vois vraiment pas mettre ca dans un backgroundworker
en clair je suis totalement perdu, ca fait un moment que je tourne en rond et j'ai vraiment besoin qu'on me guide un peu.
Donc voila.
merci d'avance