Directory.EnumerateFiles => UnauthorizedAccessException

前端 未结 5 655
滥情空心
滥情空心 2020-11-27 03:42

There is a nice new method in .NET 4.0 for getting files in a directory in a streaming way via enumeration.

The problem here is that if one wishes to enumerate all f

5条回答
  •  迷失自我
    2020-11-27 03:51

    I'm late, but I suggest using observable pattern instead:

    public class FileUtil
    {
      private static void FindFiles_(string path, string pattern,
        SearchOption option, IObserver obs, CancellationToken token)
      {
        try
        {
          foreach (var file in Directory.EnumerateFiles(path, pattern,
            SearchOption.TopDirectoryOnly))
          {
            if (token.IsCancellationRequested) break;
            obs.OnNext(file);
          }
    
          if (option != SearchOption.AllDirectories) return;
    
          foreach (var dir in Directory.EnumerateDirectories(path, "*", 
            SearchOption.TopDirectoryOnly))
          {
            FindFiles_(dir, pattern, option, obs, token);
          }
        }
        catch (UnauthorizedAccessException) { }
        catch (PathTooLongException) { }
        catch (IOException) { }
        catch (Exception err) { obs.OnError(err); }
      }
    
      public static IObservable GetFiles(string root, string pattern,
        SearchOption option)
      {
        return Observable.Create(
          (obs, token) =>
            Task.Factory.StartNew(
              () =>
              {
                FindFiles_(root, pattern, option, obs, token);
                obs.OnCompleted();
              },
              token));
      }
    }
    

提交回复
热议问题