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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| public partial class FormExploreDirectory : Form
{
public FormExploreDirectory()
{
InitializeComponent();
btnCancel.Enabled = false;
txtTemporization.Text = 10.ToString();
}
private BackgroundWorker _bw;
private void btnSelect_Click(object sender, EventArgs e)
{
using (var dialog = new FolderBrowserDialog
{
SelectedPath = !string.IsNullOrEmpty(txtPath.Text) ? txtPath.Text : @"C:\"
})
{
var result = dialog.ShowDialog();
if (result == DialogResult.OK)
{
txtPath.Text = dialog.SelectedPath;
}
}
}
private void btnStart_Click(object sender, EventArgs e)
{
txtTemporization.Enabled = false;
txtPath.Enabled = false;
btnSelect.Enabled = true;
btnStart.Enabled = false;
_bw = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
_bw.DoWork += Bw_DoWork;
_bw.ProgressChanged += Bw_ProgressChanged;
_bw.RunWorkerCompleted += Bw_RunWorkerCompleted;
txtResult.Text = string.Empty;
btnCancel.Enabled = true;
var temporization = int.Parse(txtTemporization.Text);
_bw.RunWorkerAsync((txtPath.Text, temporization));
}
private void Bw_DoWork(object sender, DoWorkEventArgs e)
{
var worker = (BackgroundWorker)sender;
var (path, temporization) = ((string, int))e.Argument;
using (var writer = new StreamWriter(File.OpenWrite("tmp.txt")))
{
ExploreDirectory(path, temporization, worker, e, writer);
}
}
private void ExploreDirectory(string path, int temporization, BackgroundWorker worker, DoWorkEventArgs e, TextWriter writer)
{
Thread.Sleep(temporization); // Temporisation pour ne pas surcharger l'ui de messages
var files = Directory.GetFiles(path);
var items = files.Prepend(path).ToArray();
writer.WriteLine(string.Join(Environment.NewLine, items));
worker.ReportProgress(0, items);
var directories = Directory.GetDirectories(path);
foreach (var directory in directories)
{
if (worker.CancellationPending)
{
e.Cancel = true;
return;
}
ExploreDirectory(directory, temporization, worker, e, writer);
}
}
private void Bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
var items = (string[])e.UserState;
txtResult.Text = string.Join(Environment.NewLine, items);
}
private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
try { txtResult.Text = File.ReadAllText("tmp.txt"); }
catch { }
if (e.Cancelled)
MessageBox.Show("Vous avez annulé la recherche", "Action annullée", MessageBoxButtons.OK, MessageBoxIcon.Warning);
else if (e.Error != null)
MessageBox.Show(e.Error.Message, "Une erreur s'est produite", MessageBoxButtons.OK, MessageBoxIcon.Error);
else
MessageBox.Show("La recherche est terminée", "Terminé", MessageBoxButtons.OK, MessageBoxIcon.Information);
txtTemporization.Enabled = true;
txtPath.Enabled = true;
btnSelect.Enabled = true;
btnStart.Enabled = true;
btnCancel.Enabled = false;
}
private void btnCancel_Click(object sender, EventArgs e)
{
_bw.CancelAsync();
btnCancel.Enabled = false;
btnStart.Enabled = true;
_bw = null;
}
private void txtTemporization_TextChanged(object sender, EventArgs e)
{
if (!int.TryParse(txtTemporization.Text, out int _))
txtTemporization.Text = 10.ToString();
}
} |