Example #1
0
        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;
            }
        }
Example #2
0
        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[] { });
        }
Example #3
0
        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[] { });
        }