private MockFileData GetMockFileDataForWrite() { return(mockFileDataAccessor.GetFile(directoryPath) ?? throw CommonExceptions.FileNotFound(directoryPath)); }
public override string GetFullPath(string path) { if (path == null) { throw new ArgumentNullException(nameof(path), StringResources.Manager.GetString("VALUE_CANNOT_BE_NULL")); } if (path.Length == 0) { throw CommonExceptions.PathIsNotOfALegalForm(nameof(path)); } path = path.Replace(AltDirectorySeparatorChar, DirectorySeparatorChar); bool isUnc = mockFileDataAccessor.StringOperations.StartsWith(path, @"\\") || mockFileDataAccessor.StringOperations.StartsWith(path, @"//"); string root = GetPathRoot(path); bool hasTrailingSlash = path.Length > 1 && path[path.Length - 1] == DirectorySeparatorChar; string[] pathSegments; if (root.Length == 0) { // relative path on the current drive or volume path = mockFileDataAccessor.Directory.GetCurrentDirectory() + DirectorySeparatorChar + path; pathSegments = GetSegments(path); } else if (isUnc) { // unc path pathSegments = GetSegments(path); if (pathSegments.Length < 2) { throw CommonExceptions.InvalidUncPath(nameof(path)); } } else if (mockFileDataAccessor.StringOperations.Equals(@"\", root) || mockFileDataAccessor.StringOperations.Equals(@"/", root)) { // absolute path on the current drive or volume pathSegments = GetSegments(GetPathRoot(mockFileDataAccessor.Directory.GetCurrentDirectory()), path); } else { pathSegments = GetSegments(path); } // unc paths need at least two segments, the others need one segment var isUnixRooted = mockFileDataAccessor.StringOperations.StartsWith( mockFileDataAccessor.Directory.GetCurrentDirectory(), string.Format(CultureInfo.InvariantCulture, "{0}", DirectorySeparatorChar)); var minPathSegments = isUnc ? 2 : isUnixRooted ? 0 : 1; var stack = new Stack <string>(); foreach (var segment in pathSegments) { if (mockFileDataAccessor.StringOperations.Equals("..", segment)) { // only pop, if afterwards are at least the minimal amount of path segments if (stack.Count > minPathSegments) { stack.Pop(); } } else if (mockFileDataAccessor.StringOperations.Equals(".", segment)) { // ignore . } else { stack.Push(segment); } } var fullPath = string.Join(string.Format(CultureInfo.InvariantCulture, "{0}", DirectorySeparatorChar), stack.Reverse().ToArray()); if (hasTrailingSlash) { fullPath += DirectorySeparatorChar; } if (isUnixRooted && !isUnc) { fullPath = DirectorySeparatorChar + fullPath; } else if (isUnixRooted) { fullPath = @"//" + fullPath; } else if (isUnc) { fullPath = @"\\" + fullPath; } return(fullPath); }
private string[] GetFilesInternal( IEnumerable <string> files, string path, string searchPattern, SearchOption searchOption) { if (path == null) { throw new ArgumentNullException(nameof(path)); } if (path.Any(c => Path.GetInvalidPathChars().Contains(c))) { throw new ArgumentException("Invalid character(s) in path", nameof(path)); } CheckSearchPattern(searchPattern); path = path.TrimSlashes(); path = path.NormalizeSlashes(); if (!Exists(path)) { throw CommonExceptions.CouldNotFindPartOfPath(path); } path = EnsureAbsolutePath(path); if (!path.EndsWith(Path.DirectorySeparatorChar.ToString())) { path += Path.DirectorySeparatorChar; } var isUnix = XFS.IsUnixPlatform(); var allDirectoriesPattern = isUnix ? @"([^<>:""/|?*]*/)*" : @"([^<>:""/\\|?*]*\\)*"; string fileNamePattern; string pathPatternSpecial = null; if (searchPattern == "*") { fileNamePattern = isUnix ? @"[^/]*?/?" : @"[^\\]*?\\?"; } else { fileNamePattern = Regex.Escape(searchPattern) .Replace(@"\*", isUnix ? @"[^<>:""/|?*]*?" : @"[^<>:""/\\|?*]*?") .Replace(@"\?", isUnix ? @"[^<>:""/|?*]?" : @"[^<>:""/\\|?*]?"); var extension = Path.GetExtension(searchPattern); bool hasExtensionLengthOfThree = extension != null && extension.Length == 4 && !extension.Contains("*") && !extension.Contains("?"); if (hasExtensionLengthOfThree) { var fileNamePatternSpecial = string.Format(CultureInfo.InvariantCulture, "{0}[^.]", fileNamePattern); pathPatternSpecial = string.Format( CultureInfo.InvariantCulture, isUnix ? @"(?i:^{0}{1}{2}(?:/?)$)" : @"(?i:^{0}{1}{2}(?:\\?)$)", Regex.Escape(path), searchOption == SearchOption.AllDirectories ? allDirectoriesPattern : string.Empty, fileNamePatternSpecial); } } var pathPattern = string.Format( CultureInfo.InvariantCulture, isUnix ? @"(?i:^{0}{1}{2}(?:/?)$)" : @"(?i:^{0}{1}{2}(?:\\?)$)", Regex.Escape(path), searchOption == SearchOption.AllDirectories ? allDirectoriesPattern : string.Empty, fileNamePattern); return(files .Where(p => Regex.IsMatch(p, pathPattern) || (pathPatternSpecial != null && Regex.IsMatch(p, pathPatternSpecial))) .ToArray()); }