(exe)
using System;
using System.IO;
class Program {
static int Main(string[] args) {
try {
string root = args.Length == 1 ? args[0] :
Environment.CurrentDirectory;
string[] dirs = Directory.GetDirectories(args[0], "*.*",
SearchOption.AllDirectories);
int count = dirs.Length, lastPercent = -1;
for (int i = 0; i < count; i++) {
int percent = (i * 100) / count;
if (percent != lastPercent) {
Console.WriteLine(percent.ToString() + "%");
}
foreach (string file in Directory.GetFiles(dirs)) {
Console.WriteLine(file);
}
}
return 0;
} catch (Exception ex) {
Console.Error.WriteLine(ex.Message);
return -1;
}
}
}
(winform)
using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;
class SomeForm : Form {
static void Main() {
Application.EnableVisualStyles();
using (Form f = new SomeForm()) {
Application.Run(f);
}
}
Button goStop;
BackgroundWorker worker;
const string BUTTON_TEXT = "Go";
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
goStop = new Button();
goStop.Text = BUTTON_TEXT;
goStop.Click += new EventHandler(goStop_Click);
Controls.Add(goStop);
worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;
worker.WorkerReportsProgress = true;
worker.DoWork+=new DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged += new
ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerCompleted += new
RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
}
void worker_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e) {
goStop.Text = BUTTON_TEXT;
if (e.Cancelled) {
this.Text = "cancelled";
} else if ((int) e.Result == 0) {
this.Text = "complete";
} else {
this.Text = "error " + e.Result.ToString();
}
}
void worker_ProgressChanged(object sender,
ProgressChangedEventArgs e) {
goStop.Text = e.ProgressPercentage.ToString() + "%";
}
void goStop_Click(object sender, EventArgs e) {
if (worker.IsBusy) {
worker.CancelAsync();
} else {
worker.RunWorkerAsync();
}
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
string exe = @"c:\walker.exe", root = @"c:\develop\t";
ProcessStartInfo psi = new ProcessStartInfo(exe, root);
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.CreateNoWindow = true;
using(Process proc = Process.Start(psi))
using(StreamReader reader = proc.StandardOutput) {
worker.ReportProgress(0);
Regex re = new Regex(@"\d{1,3}%");
int index = 0;
while (!reader.EndOfStream) {
if (worker.CancellationPending) {
proc.Kill();
e.Cancel = true;
break;
}
string line = reader.ReadLine();
if (re.IsMatch(line)) {
worker.ReportProgress(int.Parse(line.TrimEnd('%')));
} else {
if (index++ % 20 == 0) {
this.Invoke((MethodInvoker)delegate {
this.Text = line;
});
}
}
}
if (!e.Cancel) {
e.Result = proc.ExitCode;
}
}
}
}