using System;
using System.Text;
using System.Runtime.InteropServices;
using System.ComponentModel;
namespace Orthogonal.Samples
{
///
/// A simple console command to drive and test the Win32FileFinder class.
/// Command syntax is:
/// finder [ filemask ] [ maxfiles ]
///
public sealed class FinderCommand
{
private Win32FileFinder finder;
private int findCount;
private string filemask;
private int maxfiles;
private StringBuilder sb;
static void Main(string[] args)
{
new FinderCommand().Run(args);
}
public void Run(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("SYNTAX: finder [ filemask ] [ maxfiles ]");
return;
}
sb = new StringBuilder(64);
finder = new Win32FileFinder();
finder.FileFound += new FileFoundEventHandler(finder_FileFound);
if (args.Length >= 1)
filemask = args[0];
if (args.Length >= 2)
int.TryParse(args[1], out maxfiles);
try
{
finder.Find(filemask);
}
catch (ArgumentException argex)
{
Console.WriteLine("{0} -> '{1}'", argex.Message, filemask);
}
catch (FileFinderException ex)
{
Win32Exception ex32 = (Win32Exception)ex.InnerException;
Console.WriteLine("error: {0}\nMessage: {1}\nError Code: 0x{2,8:x8}\nNative Code: 0x{3,8:x8}",
ex.Message,
ex32.Message,
ex32.ErrorCode,
ex32.NativeErrorCode);
}
}
private void finder_FileFound(object sender, FileFoundEventArgs e)
{
++findCount;
if ((maxfiles > 0) && (findCount > maxfiles))
{
e.Cancel = true;
return;
}
if (e.File != null)
{
sb.Length = 64;
StrFormatByteSize(e.File.Length, sb, sb.Length);
Console.WriteLine("{0:yyMMddHHmmss} {1:yyMMddHHmmss} {2,10} {3}",
e.File.CreationTime,
e.File.LastWriteTime,
sb.ToString().Trim(),
e.File.FullName);
}
else
{
Console.WriteLine("
{0}", e.Folder.FullName);
}
}
[DllImport("Shlwapi.dll", CharSet = CharSet.Auto)]
public static extern long StrFormatByteSize(long fileSize, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder buffer, int bufferSize);
}
}