< Summary

Information
Class: DirectSight.Common.WildCardFileSearch
Assembly DirectSight
File(s): /home/runner/work/DirectSight/DirectSight/DirectSight/Common/WildCardFileSearch.cs
Line coverage
85%
Covered lines: 65
Uncovered lines: 11
Coverable lines: 76
Total lines: 129
Line coverage: 85.5%
Branch coverage
89%
Covered branches: 34
Total branches: 38
Branch coverage: 89.4%
Method coverage

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
GetFiles()83.33%242476.59%
GetDirectories()100%1414100%

File(s)

/home/runner/work/DirectSight/DirectSight/DirectSight/Common/WildCardFileSearch.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.IO;
 4using System.Linq;
 5
 6namespace DirectSight.Common;
 7
 8/// <summary>
 9/// Searches files based on file pattern with support for wildcards.
 10/// </summary>
 11internal static class WildCardFileSearch
 12{
 13    /// <summary>
 14    /// Gets the files matching the given file pattern..
 15    /// </summary>
 16    /// <param name="pattern">The file pattern.</param>
 17    /// <returns>The files.</returns>
 18    internal static IEnumerable<string> GetFiles(string pattern)
 1119    {
 1120        if (string.IsNullOrEmpty(pattern))
 221        {
 222            throw new ArgumentException("Pattern must not be empty.", nameof(pattern));
 23        }
 24
 925        if (pattern.Intersect(Path.GetInvalidPathChars()).Any())
 026        {
 027            throw new ArgumentException("Pattern contains invalid character.", nameof(pattern));
 28        }
 29
 930        pattern = pattern.Replace('/', Path.DirectorySeparatorChar);
 31
 932        bool pathRooted = Path.IsPathRooted(pattern);
 33
 934        if (!pathRooted)
 235        {
 236            pattern = Path.Combine(Directory.GetCurrentDirectory(), pattern);
 237        }
 38
 939        string[] parts = pattern.Split([Path.DirectorySeparatorChar], StringSplitOptions.RemoveEmptyEntries);
 40
 941        if (pathRooted && parts.Length < 2)
 342        {
 343            throw new ArgumentException("Pattern in no valid file pattern.", nameof(pattern));
 44        }
 45
 646        bool directoryIsUNCPath = pattern.StartsWith(@"\\", StringComparison.Ordinal);
 47
 648        if (directoryIsUNCPath)
 049        {
 050            parts[0] = @"\\" + parts[0];
 051        }
 652        else if (pattern.StartsWith(@"\", StringComparison.Ordinal))
 053        {
 054            parts[0] = @"\" + parts[0];
 055        }
 56
 657        if (pattern.StartsWith("/", StringComparison.Ordinal))
 658        {
 659            parts[0] = "/" + parts[0];
 660        }
 61
 662        if (parts[0].EndsWith(":"))
 063        {
 064            parts[0] = parts[0] + Path.DirectorySeparatorChar;
 065        }
 66
 667        string[] directoryParts = parts.Take(parts.Length - 1).ToArray();
 68
 669        string filePattern = parts.Last();
 70
 3671        foreach (string directory in GetDirectories(directoryParts[0], directoryParts, 1, directoryIsUNCPath))
 972        {
 973            if (Directory.Exists(directory))
 974            {
 26175                foreach (string file in Directory.EnumerateFiles(directory, filePattern))
 11776                {
 11777                    yield return file;
 11778                }
 979            }
 980        }
 681    }
 82
 83    /// <summary>
 84    /// Gets the directories matching the given directory parts.
 85    /// </summary>
 86    /// <param name="directory">The directory.</param>
 87    /// <param name="directoryParts">The directory parts.</param>
 88    /// <param name="currentIndex">Index of the current part.</param>
 89    /// <param name="directoryIsUNCPath">if set to <c>true</c> directory is UNC path.</param>
 90    /// <returns>The directories.</returns>
 91    private static IEnumerable<string> GetDirectories(string directory, string[] directoryParts, int currentIndex, bool 
 4992    {
 93        // UNC paths need special treatment Directory.Exists("\\SomeUNCPath") returns false if no subdirectory is specif
 4994        if (!Directory.Exists(directory) && !(currentIndex == 1 && directoryIsUNCPath))
 195        {
 196            yield break;
 97        }
 98
 4899        if (currentIndex >= directoryParts.Length)
 9100        {
 9101            yield return directory;
 9102        }
 39103        else if (directoryParts[currentIndex].Contains("*"))
 7104        {
 7105            var subDirectories = Directory.EnumerateDirectories(directory, directoryParts[currentIndex]);
 106
 43107            foreach (var subDirectory in subDirectories)
 11108            {
 11109                var subsubDirectories = GetDirectories(subDirectory, directoryParts, currentIndex + 1, directoryIsUNCPat
 110
 53111                foreach (var subsubDirectory in subsubDirectories)
 10112                {
 10113                    yield return subsubDirectory;
 10114                }
 11115            }
 7116        }
 117        else
 32118        {
 32119            directory = Path.Combine(directory, directoryParts[currentIndex]);
 120
 32121            var subsubDirectories = GetDirectories(directory, directoryParts, currentIndex + 1, directoryIsUNCPath);
 122
 206123            foreach (var subsubDirectory in subsubDirectories)
 55124            {
 55125                yield return subsubDirectory;
 55126            }
 32127        }
 48128    }
 129}

Methods/Properties

GetFiles()
GetDirectories()