private void Directory_EnumerateFileSystemEntryInfos_ContinueOnAccessDeniedExceptionUsingErrorFilter(bool isNetwork)
        {
            UnitTestConstants.PrintUnitTestHeader(isNetwork);

            var inputPath = System.IO.Directory.GetParent(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)).FullName;

            if (isNetwork)
            {
                inputPath = Alphaleonis.Win32.Filesystem.Path.LocalToUnc(inputPath);
            }

            Console.WriteLine("\nInput Directory Path: [{0}]\n", inputPath);


            var gotException   = false;
            var exceptionCount = 0;

            var dirEnumOptions = Alphaleonis.Win32.Filesystem.DirectoryEnumerationOptions.Recursive;

            var filters = new Alphaleonis.Win32.Filesystem.DirectoryEnumerationFilters
            {
                ErrorFilter = delegate(int errorCode, string errorMessage, string pathProcessed)
                {
                    gotException = errorCode == Alphaleonis.Win32.Win32Errors.ERROR_ACCESS_DENIED;

                    if (gotException)
                    {
                        exceptionCount++;

                        // Report Exception.
                        Console.WriteLine("\t#{0:N0}\t({1}) {2}: [{3}]", exceptionCount, errorCode, errorMessage, pathProcessed);
                    }


                    // Continue enumeration.
                    return(gotException);
                }
            };


            var count = Alphaleonis.Win32.Filesystem.Directory.EnumerateFileSystemEntryInfos <string>(inputPath, dirEnumOptions, filters).Count();


            Console.WriteLine("\n\tFile system objects counted: {0:N0}", count);


            Assert.IsTrue(count > 0, "No directories enumerated, but it is expected.");
            Assert.IsTrue(gotException, "The Exception is not caught, but it is expected.");

            Console.WriteLine();
        }
        private void Test_ContinueOnAccessDeniedExceptionUsingErrorFilter(string inputPath)
        {
            var       gotException   = false;
            const int exceptionCatch = 10;
            var       exceptionCount = 0;


#if NET35
            var abortEnumeration = false;


            var filters = new Alphaleonis.Win32.Filesystem.DirectoryEnumerationFilters
            {
                // Filter to decide whether to recurse into subdirectories.
                RecursionFilter = fsei =>
                {
                    // Return true to continue recursion, false to skip.
                    return(!abortEnumeration);
                },


                // Filter to process Exception handling.
                ErrorFilter = delegate(int errorCode, string errorMessage, string pathProcessed)
                {
                    if (abortEnumeration)
                    {
                        return(true);
                    }


                    gotException = errorCode == Alphaleonis.Win32.Win32Errors.ERROR_ACCESS_DENIED;
                    if (gotException)
                    {
                        exceptionCount++;

                        if (exceptionCount == exceptionCatch)
                        {
                            abortEnumeration = true;
                        }
                    }


                    // Report Exception.
                    Console.WriteLine("\t#{0:N0}\t({1}) {2}: [{3}]", exceptionCount, errorCode, errorMessage, pathProcessed);


                    // Return true to continue, false to throw the Exception.
                    return(gotException);
                }
            };
#else
            var cancelSource = new CancellationTokenSource();


            var filters = new Alphaleonis.Win32.Filesystem.DirectoryEnumerationFilters
            {
                // Used to abort the enumeration.
                CancellationToken = cancelSource.Token,


                // Filter to process Exception handling.
                ErrorFilter = delegate(int errorCode, string errorMessage, string pathProcessed)
                {
                    gotException = errorCode == Alphaleonis.Win32.Win32Errors.ERROR_ACCESS_DENIED;
                    if (gotException)
                    {
                        exceptionCount++;

                        if (exceptionCount == exceptionCatch)
                        {
                            cancelSource.Cancel();
                        }
                    }


                    // Report Exception.
                    Console.WriteLine("\t#{0:N0}\t({1}) {2}: [{3}]", exceptionCount, errorCode, errorMessage, pathProcessed);


                    // Return true to continue, false to throw the Exception.
                    return(gotException);
                }
            };
#endif


            const Alphaleonis.Win32.Filesystem.DirectoryEnumerationOptions dirEnumOptions = Alphaleonis.Win32.Filesystem.DirectoryEnumerationOptions.Recursive;

            var fsoCount = Alphaleonis.Win32.Filesystem.Directory.EnumerateFileSystemEntryInfos <string>(inputPath, dirEnumOptions, filters).Count();


            Console.WriteLine("\n\tFile system objects counted: {0:N0}", fsoCount);


            Assert.IsTrue(fsoCount > 0, "No file system entries enumerated, but it is expected.");

            Assert.IsTrue(gotException, "The Exception is not caught, but it is expected.");

            Assert.AreEqual(exceptionCatch, exceptionCount, "The number of caught Exceptions does not match, but it is expected.");
        }
      private void Test_DirectoryEnumerationFilters(string inputPath)
      {
         bool gotException;

         var findExtensions = new[] {".txt", ".ini", ".exe"};
         var skipFolders = new[] {"assembly", "WinSxS"};

         Console.WriteLine("Extensions to search for: {0}", string.Join(" | ", findExtensions));
         Console.WriteLine("Root directories to skip: {0}\\{1}, {0}\\{2}", inputPath, skipFolders[0], skipFolders[1]);
         Console.WriteLine();


         var exceptionCount = 0;
         var foundExt1 = 0;
         var foundExt2 = 0;
         var foundExt3 = 0;
         var foundExt1Done = false;
         var foundExt2Done = false;
         var foundExt3Done = false;


#if NET35
         var abortEnumeration = false;


         var filters = new Alphaleonis.Win32.Filesystem.DirectoryEnumerationFilters
         {
            // Filter to decide whether to recurse into subdirectories.
            RecursionFilter = fsei =>
            {
               if (abortEnumeration)
                  return false;


               // Return true to continue recursion, false to skip.
               return !skipFolders.Any(found => found.Equals(fsei.FileName, StringComparison.OrdinalIgnoreCase));
            },


            // Filter to process Exception handling.
            ErrorFilter = delegate(int errorCode, string errorMessage, string pathProcessed)
            {
               if (abortEnumeration)
                  return true;


               gotException = errorCode == Alphaleonis.Win32.Win32Errors.ERROR_ACCESS_DENIED;

               Console.WriteLine("\t#{0:N0}\t\t({1}) {2}: [{3}]", ++exceptionCount, errorCode, errorMessage, pathProcessed);


               // Return true to continue, false to throw the Exception.
               return gotException;
            },


            // Filter to in-/exclude file system entries during the enumeration.
            InclusionFilter = fsei =>
            {
               if (abortEnumeration)
                  return false;


               var fileExtension = fsei.Extension;

               var gotMatch = findExtensions.Any(found => found.Equals(fileExtension, StringComparison.OrdinalIgnoreCase));
               if (gotMatch)
               {
                  if (!foundExt1Done && fileExtension == findExtensions[0])
                  {
                     foundExt1++;
                     foundExt1Done = foundExt1 == 3;
                     Console.WriteLine("\t#{0:N0}\t\t[{1}]", foundExt1, fsei.FullPath);
                  }

                  else if (!foundExt2Done && fileExtension == findExtensions[1])
                  {
                     foundExt2++;
                     foundExt2Done = foundExt2 == 3;
                     Console.WriteLine("\t#{0:N0}\t\t[{1}]", foundExt2, fsei.FullPath);
                  }

                  else if (!foundExt3Done && fileExtension == findExtensions[2])
                  {
                     foundExt3++;
                     foundExt3Done = foundExt3 == 3;
                     Console.WriteLine("\t#{0:N0}\t\t[{1}]", foundExt3, fsei.FullPath);
                  }
               }


               // Abort the enumeration.
               if (foundExt1Done && foundExt2Done && foundExt3Done)
                  abortEnumeration = true;


               return gotMatch;
            }
         };
#else
         var cancelSource = new CancellationTokenSource();


         var filters = new Alphaleonis.Win32.Filesystem.DirectoryEnumerationFilters
         {
            // Used to abort the enumeration.
            CancellationToken = cancelSource.Token,


            // Filter to decide whether to recurse into subdirectories.
            RecursionFilter = fsei =>
            {
               // Return true to continue recursion, false to skip.
               return !skipFolders.Any(found => found.Equals(fsei.FileName, StringComparison.OrdinalIgnoreCase));
            },


            // Filter to process Exception handling.
            ErrorFilter = delegate(int errorCode, string errorMessage, string pathProcessed)
            {
               gotException = errorCode == Alphaleonis.Win32.Win32Errors.ERROR_ACCESS_DENIED;

               Console.WriteLine("\t#{0:N0}\t\t({1}) {2}: [{3}]", ++exceptionCount, errorCode, errorMessage, pathProcessed);


               // Return true to continue, false to throw the Exception.
               return gotException;
            },


            // Filter to in-/exclude file system entries during the enumeration.
            InclusionFilter = fsei =>
            {
               var fileExtension = fsei.Extension;

               var gotMatch = findExtensions.Any(found => found.Equals(fileExtension, StringComparison.OrdinalIgnoreCase));
               if (gotMatch)
               {
                  if (!foundExt1Done && fileExtension == findExtensions[0])
                  {
                     foundExt1++;
                     foundExt1Done = foundExt1 == 3;
                     Console.WriteLine("\t#{0:N0}\t\t[{1}]", foundExt1, fsei.FullPath);
                  }

                  else if (!foundExt2Done && fileExtension == findExtensions[1])
                  {
                     foundExt2++;
                     foundExt2Done = foundExt2 == 3;
                     Console.WriteLine("\t#{0:N0}\t\t[{1}]", foundExt2, fsei.FullPath);
                  }

                  else if (!foundExt3Done && fileExtension == findExtensions[2])
                  {
                     foundExt3++;
                     foundExt3Done = foundExt3 == 3;
                     Console.WriteLine("\t#{0:N0}\t\t[{1}]", foundExt3, fsei.FullPath);
                  }
               }


               // Abort the enumeration.
               if (foundExt1Done && foundExt2Done && foundExt3Done)
                  cancelSource.Cancel();


               return gotMatch;
            }
         };
#endif


         const Alphaleonis.Win32.Filesystem.DirectoryEnumerationOptions dirEnumOptions = Alphaleonis.Win32.Filesystem.DirectoryEnumerationOptions.Files | Alphaleonis.Win32.Filesystem.DirectoryEnumerationOptions.Recursive;

         var fsoCount = Alphaleonis.Win32.Filesystem.Directory.EnumerateFileSystemEntryInfos<string>(inputPath, dirEnumOptions, filters).Count();
         
         
         Console.WriteLine("\n\tFile system objects counted: {0:N0}", fsoCount);


         Assert.IsTrue(fsoCount > 0, "No files enumerated, but it is expected.");

         Assert.IsTrue(foundExt1 > 0, "No " + findExtensions[0] + " files enumerated, but it is expected.");
         Assert.IsTrue(foundExt2 > 0, "No " + findExtensions[1] + " files enumerated, but it is expected.");
         Assert.IsTrue(foundExt3 > 0, "No " + findExtensions[2] + " files enumerated, but it is expected.");


         Console.WriteLine();
      }