public static void AddNewFakeFile(string fileFullPath, int fileSize) { string cleanPath = FakePathPrefix + UnixSeparator + SimplifyPath(fileFullPath); string[] fileFullPathParts = cleanPath.Split(_pathSeparators, StringSplitOptions.RemoveEmptyEntries); lock (s_fakeTree) { string path; if (UsesUnixSeparator) { path = UnixSeparator + fileFullPathParts[0]; } else { path = fileFullPathParts[0] + WindowsSeparator; } FakeDirEntry currentDir = s_fakeTree.GetValueOrAdd(path, new FakeDirEntry(path)); for (int i = 1; i < (fileFullPathParts.Length - 1); ++i) { path = Path.Combine(path, fileFullPathParts[i]); currentDir = currentDir.Dirs.GetValueOrAdd(fileFullPathParts[i], new FakeDirEntry(path)); } path = Path.Combine(path, fileFullPathParts[fileFullPathParts.Length - 1]); currentDir.Files.Add(fileFullPathParts[fileFullPathParts.Length - 1], new FakeFileEntry { Path = path, SizeInBytes = fileSize }); ++s_fakeFilesCount; } }
public static string[] DirectoryGetFiles(string path, string searchPattern = "*", SearchOption searchOption = SearchOption.AllDirectories) { if (CountFakeFiles() > 0) { List <string> files = new List <string>(); string cleanPath = SimplifyPath(path).Replace(WindowsSeparator, UnixSeparator); string[] fileFullPathParts = cleanPath.Split(_pathSeparators, StringSplitOptions.RemoveEmptyEntries); FakeDirEntry dir; string root; if (UsesUnixSeparator) { root = UnixSeparator + fileFullPathParts[0]; } else { root = fileFullPathParts[0] + WindowsSeparator; } if (s_fakeTree.TryGetValue(root, out dir)) { for (int i = 1; i < fileFullPathParts.Length; ++i) { if (!dir.Dirs.TryGetValue(fileFullPathParts[i], out dir)) { return new string[] { } } ; } HashSet <FakeDirEntry> visited = new HashSet <FakeDirEntry>(); Stack <FakeDirEntry> visiting = new Stack <FakeDirEntry>(); visiting.Push(dir); while (visiting.Count > 0) { FakeDirEntry visitedDir = visiting.Pop(); if (visited.Contains(visitedDir)) { continue; } visited.Add(visitedDir); files.AddRange(visitedDir.Files.Values.Select(x => x.Path)); foreach (var f in visitedDir.Dirs) { visiting.Push(f.Value); } } return(files.ToArray()); } return(new string[] { }); } if (Directory.Exists(path)) { return(Directory.GetFiles(path, searchPattern, searchOption)); } return(new string[] { }); }
public static string[] DirectoryGetDirectories(string path, string searchPattern = "*", SearchOption searchOption = SearchOption.TopDirectoryOnly) { if (CountFakeFiles() > 0) { string cleanPath = SimplifyPath(path).Replace(WindowsSeparator, UnixSeparator); string[] fileFullPathParts = cleanPath.Split(_pathSeparators, StringSplitOptions.RemoveEmptyEntries); FakeDirEntry dir; // Determine if root directory exist in the fake tree string root = UsesUnixSeparator ? UnixSeparator + fileFullPathParts[0] : fileFullPathParts[0] + WindowsSeparator; if (!s_fakeTree.TryGetValue(root, out dir)) { return new string[] { } } ; // Iterate over the provided path and validate that each part exist in the fake tree for (int i = 1; i < fileFullPathParts.Length; ++i) { if (!dir.Dirs.TryGetValue(fileFullPathParts[i], out dir)) { return new string[] { } } ; } // Setup filter if any Regex regexFilter = null; if (searchPattern != "*") { regexFilter = new Regex(ConvertWildcardToRegEx(searchPattern), RegexOptions.Singleline | RegexOptions.CultureInvariant); } // Gather file items depending of filter and search option // - TopDirectoryOnly (early exit) if (searchOption == SearchOption.TopDirectoryOnly) { return((regexFilter != null ? dir.Dirs.Where(e => regexFilter.IsMatch(e.Key)).Select(e => e.Value.Path) : dir.Dirs.Values.Select(x => x.Path)).ToArray()); } // - AllDirectories HashSet <FakeDirEntry> visited = new HashSet <FakeDirEntry>(); Stack <FakeDirEntry> visiting = new Stack <FakeDirEntry>(); List <string> directories = new List <string>(); visiting.Push(dir); while (visiting.Count > 0) { FakeDirEntry visitedDir = visiting.Pop(); if (visited.Contains(visitedDir)) { continue; } visited.Add(visitedDir); directories.AddRange(regexFilter != null ? visitedDir.Dirs.Where(e => regexFilter.IsMatch(e.Key)).Select(e => e.Value.Path) : visitedDir.Dirs.Values.Select(x => x.Path)); foreach (var f in visitedDir.Dirs) { visiting.Push(f.Value); } } return(directories.ToArray()); } if (Directory.Exists(path)) { return(Directory.GetDirectories(path, searchPattern, searchOption)); } return(new string[] { }); }