public void AddDirectory(string path) { var fixedPath = FixPath(path, true); var separator = XFS.Separator(); lock (files) { if (FileExists(fixedPath) && (GetFile(fixedPath).Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) { throw new UnauthorizedAccessException(string.Format(CultureInfo.InvariantCulture, StringResources.Manager.GetString("ACCESS_TO_THE_PATH_IS_DENIED"), fixedPath)); } var lastIndex = 0; bool isUnc = fixedPath.StartsWith(@"\\", StringComparison.OrdinalIgnoreCase) || fixedPath.StartsWith(@"//", StringComparison.OrdinalIgnoreCase); if (isUnc) { //First, confirm they aren't trying to create '\\server\' lastIndex = fixedPath.IndexOf(separator, 2, StringComparison.OrdinalIgnoreCase); if (lastIndex < 0) { throw new ArgumentException(@"The UNC path should be of the form \\server\share.", "path"); } /* * Although CreateDirectory(@"\\server\share\") is not going to work in real code, we allow it here for the purposes of setting up test doubles. * See PR https://github.com/System-IO-Abstractions/System.IO.Abstractions/pull/90 for conversation */ } while ((lastIndex = fixedPath.IndexOf(separator, lastIndex + 1, StringComparison.OrdinalIgnoreCase)) > -1) { var segment = fixedPath.Substring(0, lastIndex + 1); if (!Directory.Exists(segment)) { SetEntry(segment, new MockDirectoryData()); } } var s = fixedPath.EndsWith(separator, StringComparison.OrdinalIgnoreCase) ? fixedPath : fixedPath + separator; SetEntry(s, new MockDirectoryData()); } }