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); } }