static async Task Xmp2() { // you can use CancellationToken so that the app user can request cancel on UI. CancellationToken ct = CancellationToken.None; await foreach (var e in Fsentry.VisitAsync("../.", ct)) { if (e.Event == FsentryEvent.EnterDir) { Console.WriteLine($"ENTER: {e.FullPathString}"); // you can do this: // if (ShouldSkip(e.RelativePath)) // { // Console.WriteLine($"skip visiting into the dir:{e.RelativePath}"); // e.Command = FentryCommand.SkipDirectory; // continue; // } } else if (e.Event == FsentryEvent.File) { Console.WriteLine($"FILE : {e.FullPathString}"); } else if (e.Event == FsentryEvent.LeaveDir) { Console.WriteLine($"LEAVE: {e.FullPathString}"); } } }
public async Task Test2Async() { // ディレクトリやファイルを実際のファイルシステム上に用意 var temp = GetTempDir(); using var deleteLater = new Defer(() => CleanupTempDir(temp)); var pathSet = new HashSet <string>() { "file0.txt", "dir1/file1-1.txt", "dir1/file1-2.txt", "dir2", "dir3-1/dir3-2/file3-1.txt", "dir3-1/dir3-2/dir3-3/file3-2.txt", }; foreach (var path in pathSet) { await SetupPathAsync(temp.Combine(_AsItems(path))); } // テスト実行。見つかったディレクトリやファイルを変数 pathSet から消していく // ただし、dir3-1 の中身を無視してみる var skipCount = 0; await foreach (var entry in Fsentry.VisitAsync(temp)) { Assert.IsFalse(entry.RelativePath.IsAbsolute); var relPathStr = entry.RelativePath.ToString("/"); if (entry.Event == FsentryEvent.EnterDir) { if (relPathStr.Contains("dir3-1")) { entry.Command = FsentryCommand.SkipDirectory; skipCount++; continue; } if (pathSet.Contains(relPathStr)) { pathSet.Remove(relPathStr); } } else if (entry.Event == FsentryEvent.File) { Assert.IsTrue(pathSet.Contains(relPathStr)); pathSet.Remove(relPathStr); } } // 1度だけ skip したはず。"dir3-1" を見つけてすぐ skip したので、中のディレクトリの探索はしていないはず Assert.AreEqual(1, skipCount); // pathSet は 2 つ残ったはず Assert.AreEqual(2, pathSet.Count); }
public async Task Test1Async() { // ディレクトリやファイルを実際のファイルシステム上に用意 var temp = GetTempDir(); using var deleteLater = new Defer(() => CleanupTempDir(temp)); var pathSet = new HashSet <string>() { "file0.txt", "dir1/file1-1.txt", "dir1/file1-2.txt", "dir2", "dir3-1/dir3-2/file3-1.txt", "dir3-1/dir3-2/dir3-3/file3-2.txt", }; foreach (var path in pathSet) { await SetupPathAsync(temp.Combine(_AsItems(path))); } // テスト実行。見つかったディレクトリやファイルを変数 pathSet から消していく await foreach (var entry in Fsentry.VisitAsync(temp)) { Assert.IsFalse(entry.RelativePath.IsAbsolute); var relPathStr = entry.RelativePath.ToString("/"); if (entry.Event == FsentryEvent.EnterDir) { if (pathSet.Contains(relPathStr)) { pathSet.Remove(relPathStr); } } else if (entry.Event == FsentryEvent.File) { Assert.IsTrue(pathSet.Contains(relPathStr)); pathSet.Remove(relPathStr); } } // pathSet は全て無くなったはず Assert.AreEqual(0, pathSet.Count); }