diff --git a/Directory.Build.props b/Directory.Build.props
index 5c5234105..93ebc9a67 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -12,9 +12,7 @@
README.md
$(DefineConstants);FEATURE_FILE_SYSTEM_ACL_EXTENSIONS
$(DefineConstants);FEATURE_ASYNC_FILE;FEATURE_ENUMERATION_OPTIONS;FEATURE_ADVANCED_PATH_OPERATIONS;FEATURE_PATH_JOIN_WITH_SPAN
- $(DefineConstants);FEATURE_FILE_MOVE_WITH_OVERWRITE
- $(DefineConstants);FEATURE_SUPPORTED_OS_ATTRIBUTE
- $(DefineConstants);FEATURE_FILE_SYSTEM_WATCHER_FILTERS
+ $(DefineConstants);FEATURE_FILE_MOVE_WITH_OVERWRITE;FEATURE_SUPPORTED_OS_ATTRIBUTE;FEATURE_FILE_SYSTEM_WATCHER_FILTERS;FEATURE_ENDS_IN_DIRECTORY_SEPARATOR;FEATURE_PATH_JOIN_WITH_PARAMS;FEATURE_PATH_JOIN_WITH_FOUR_PATHS
diff --git a/src/System.IO.Abstractions/IPath.cs b/src/System.IO.Abstractions/IPath.cs
index 47b3e1516..1f9d98953 100644
--- a/src/System.IO.Abstractions/IPath.cs
+++ b/src/System.IO.Abstractions/IPath.cs
@@ -79,5 +79,64 @@ public interface IPath
///
bool TryJoin(ReadOnlySpan path1, ReadOnlySpan path2, Span destination, out int charsWritten);
#endif
+
+#if FEATURE_ADVANCED_PATH_OPERATIONS
+ ///
+ bool HasExtension(ReadOnlySpan path);
+
+ ///
+ bool IsPathFullyQualified(ReadOnlySpan path);
+
+ ///
+ bool IsPathRooted(ReadOnlySpan path);
+
+ ///
+ ReadOnlySpan GetDirectoryName(ReadOnlySpan path);
+
+ ///
+ ReadOnlySpan GetExtension(ReadOnlySpan path);
+
+ ///
+ ReadOnlySpan GetFileName(ReadOnlySpan path);
+
+ ///
+ ReadOnlySpan GetFileNameWithoutExtension(ReadOnlySpan path);
+
+ ///
+ ReadOnlySpan GetPathRoot(ReadOnlySpan path);
+
+#endif
+
+#if FEATURE_PATH_JOIN_WITH_PARAMS
+ ///
+ string Join(string path1, string path2);
+
+ ///
+ string Join(string path1, string path2, string path3);
+
+ ///
+ string Join(params string[] paths);
+#endif
+
+#if FEATURE_ENDS_IN_DIRECTORY_SEPARATOR
+ ///
+ bool EndsInDirectorySeparator(ReadOnlySpan path);
+
+ ///
+ bool EndsInDirectorySeparator(string path);
+
+ ///
+ ReadOnlySpan TrimEndingDirectorySeparator(ReadOnlySpan path);
+ ///
+ string TrimEndingDirectorySeparator(string path);
+#endif
+
+#if FEATURE_PATH_JOIN_WITH_FOUR_PATHS
+ ///
+ string Join(ReadOnlySpan path1, ReadOnlySpan path2, ReadOnlySpan path3, ReadOnlySpan path4);
+
+ ///
+ string Join(string path1, string path2, string path3, string path4);
+#endif
}
}
\ No newline at end of file
diff --git a/src/System.IO.Abstractions/PathBase.cs b/src/System.IO.Abstractions/PathBase.cs
index d8ad2f23b..37d036053 100644
--- a/src/System.IO.Abstractions/PathBase.cs
+++ b/src/System.IO.Abstractions/PathBase.cs
@@ -114,5 +114,56 @@ internal PathBase() { }
///
public abstract bool TryJoin(ReadOnlySpan path1, ReadOnlySpan path2, Span destination, out int charsWritten);
#endif
+
+#if FEATURE_ADVANCED_PATH_OPERATIONS
+ ///
+ public abstract bool HasExtension(ReadOnlySpan path);
+ ///
+ public abstract bool IsPathFullyQualified(ReadOnlySpan path);
+ ///
+ public abstract bool IsPathRooted(ReadOnlySpan path);
+ ///
+ public abstract ReadOnlySpan GetDirectoryName(ReadOnlySpan path);
+ ///
+ public abstract ReadOnlySpan GetExtension(ReadOnlySpan path);
+ ///
+ public abstract ReadOnlySpan GetFileName(ReadOnlySpan path);
+ ///
+ public abstract ReadOnlySpan GetFileNameWithoutExtension(ReadOnlySpan path);
+ ///
+ public abstract ReadOnlySpan GetPathRoot(ReadOnlySpan path);
+
+#endif
+#if FEATURE_PATH_JOIN_WITH_PARAMS
+ ///
+ public abstract string Join(params string[] paths);
+
+ ///
+ public abstract string Join(string path1, string path2);
+ ///
+
+ public abstract string Join(string path1, string path2, string path3);
+
+#endif
+
+#if FEATURE_ENDS_IN_DIRECTORY_SEPARATOR
+ ///
+ public abstract bool EndsInDirectorySeparator(ReadOnlySpan path);
+ ///
+ public abstract bool EndsInDirectorySeparator(string path);
+ ///
+ public abstract ReadOnlySpan TrimEndingDirectorySeparator(ReadOnlySpan path);
+
+ ///
+ public abstract string TrimEndingDirectorySeparator(string path);
+#endif
+
+#if FEATURE_PATH_JOIN_WITH_FOUR_PATHS
+
+ ///
+ public abstract string Join(ReadOnlySpan path1, ReadOnlySpan path2, ReadOnlySpan path3, ReadOnlySpan path4);
+ ///
+ public abstract string Join(string path1, string path2, string path3, string path4);
+#endif
}
}
diff --git a/src/System.IO.Abstractions/PathWrapper.cs b/src/System.IO.Abstractions/PathWrapper.cs
index bfe8bbbea..9c5151d5d 100644
--- a/src/System.IO.Abstractions/PathWrapper.cs
+++ b/src/System.IO.Abstractions/PathWrapper.cs
@@ -187,5 +187,115 @@ public override bool IsPathRooted(string path)
{
return Path.IsPathRooted(path);
}
+
+#if FEATURE_ENDS_IN_DIRECTORY_SEPARATOR
+ ///
+ public override bool EndsInDirectorySeparator(ReadOnlySpan path)
+ {
+ return Path.EndsInDirectorySeparator(path);
+ }
+
+ ///
+ public override bool EndsInDirectorySeparator(string path)
+ {
+ return Path.EndsInDirectorySeparator(path);
+ }
+
+ ///
+ public override ReadOnlySpan TrimEndingDirectorySeparator(ReadOnlySpan path)
+ {
+ return Path.TrimEndingDirectorySeparator(path);
+ }
+
+ ///
+ public override string TrimEndingDirectorySeparator(string path)
+ {
+ return Path.TrimEndingDirectorySeparator(path);
+ }
+#endif
+
+#if FEATURE_ADVANCED_PATH_OPERATIONS
+ ///
+ public override bool HasExtension(ReadOnlySpan path)
+ {
+ return Path.HasExtension(path);
+ }
+
+ ///
+ public override bool IsPathFullyQualified(ReadOnlySpan path)
+ {
+ return Path.IsPathFullyQualified(path);
+ }
+
+ ///
+ public override bool IsPathRooted(ReadOnlySpan path)
+ {
+ return Path.IsPathRooted(path);
+ }
+
+ ///
+ public override ReadOnlySpan GetDirectoryName(ReadOnlySpan path)
+ {
+ return Path.GetDirectoryName(path);
+ }
+
+ ///
+ public override ReadOnlySpan GetExtension(ReadOnlySpan path)
+ {
+ return Path.GetExtension(path);
+ }
+
+ ///
+ public override ReadOnlySpan GetFileName(ReadOnlySpan path)
+ {
+ return Path.GetFileName(path);
+ }
+
+ ///
+ public override ReadOnlySpan GetFileNameWithoutExtension(ReadOnlySpan path)
+ {
+ return Path.GetFileNameWithoutExtension(path);
+ }
+
+ ///
+ public override ReadOnlySpan GetPathRoot(ReadOnlySpan path)
+ {
+ return Path.GetPathRoot(path);
+ }
+#endif
+
+#if FEATURE_PATH_JOIN_WITH_FOUR_PATHS
+ ///
+ public override string Join(string path1, string path2, string path3, string path4)
+ {
+ return Path.Join(path1, path2, path3, path4);
+ }
+
+ ///
+ public override string Join(ReadOnlySpan path1, ReadOnlySpan path2, ReadOnlySpan path3, ReadOnlySpan path4)
+ {
+ return Path.Join(path1, path2, path3, path4);
+ }
+#endif
+
+#if FEATURE_PATH_JOIN_WITH_PARAMS
+ ///
+ public override string Join(string path1, string path2)
+ {
+ return Path.Join(path1, path2);
+ }
+
+ ///
+ public override string Join(string path1, string path2, string path3)
+ {
+ return Path.Join(path1, path2, path3);
+ }
+
+ ///
+ public override string Join(params string[] paths)
+ {
+ return Path.Join(paths);
+ }
+#endif
}
}
diff --git a/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET 5.0.snap b/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET 5.0.snap
index 99bae9707..d83d023ac 100644
--- a/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET 5.0.snap
+++ b/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET 5.0.snap
@@ -6,23 +6,5 @@
"Char get_VolumeSeparatorChar()",
"Char[] get_InvalidPathChars()"
],
- "MissingMembers": [
- "Boolean EndsInDirectorySeparator(System.ReadOnlySpan`1[System.Char])",
- "Boolean EndsInDirectorySeparator(System.String)",
- "Boolean HasExtension(System.ReadOnlySpan`1[System.Char])",
- "Boolean IsPathFullyQualified(System.ReadOnlySpan`1[System.Char])",
- "Boolean IsPathRooted(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] GetDirectoryName(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] GetExtension(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] GetFileName(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] GetFileNameWithoutExtension(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] GetPathRoot(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] TrimEndingDirectorySeparator(System.ReadOnlySpan`1[System.Char])",
- "System.String Join(System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char])",
- "System.String Join(System.String, System.String)",
- "System.String Join(System.String, System.String, System.String)",
- "System.String Join(System.String, System.String, System.String, System.String)",
- "System.String Join(System.String[])",
- "System.String TrimEndingDirectorySeparator(System.String)"
- ]
+ "MissingMembers": []
}
diff --git a/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET 6.0.snap b/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET 6.0.snap
index 99bae9707..d83d023ac 100644
--- a/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET 6.0.snap
+++ b/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET 6.0.snap
@@ -6,23 +6,5 @@
"Char get_VolumeSeparatorChar()",
"Char[] get_InvalidPathChars()"
],
- "MissingMembers": [
- "Boolean EndsInDirectorySeparator(System.ReadOnlySpan`1[System.Char])",
- "Boolean EndsInDirectorySeparator(System.String)",
- "Boolean HasExtension(System.ReadOnlySpan`1[System.Char])",
- "Boolean IsPathFullyQualified(System.ReadOnlySpan`1[System.Char])",
- "Boolean IsPathRooted(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] GetDirectoryName(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] GetExtension(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] GetFileName(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] GetFileNameWithoutExtension(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] GetPathRoot(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] TrimEndingDirectorySeparator(System.ReadOnlySpan`1[System.Char])",
- "System.String Join(System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char])",
- "System.String Join(System.String, System.String)",
- "System.String Join(System.String, System.String, System.String)",
- "System.String Join(System.String, System.String, System.String, System.String)",
- "System.String Join(System.String[])",
- "System.String TrimEndingDirectorySeparator(System.String)"
- ]
+ "MissingMembers": []
}
diff --git a/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET Core 3.1.snap b/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET Core 3.1.snap
index 99bae9707..26dafd137 100644
--- a/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET Core 3.1.snap
+++ b/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET Core 3.1.snap
@@ -9,14 +9,6 @@
"MissingMembers": [
"Boolean EndsInDirectorySeparator(System.ReadOnlySpan`1[System.Char])",
"Boolean EndsInDirectorySeparator(System.String)",
- "Boolean HasExtension(System.ReadOnlySpan`1[System.Char])",
- "Boolean IsPathFullyQualified(System.ReadOnlySpan`1[System.Char])",
- "Boolean IsPathRooted(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] GetDirectoryName(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] GetExtension(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] GetFileName(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] GetFileNameWithoutExtension(System.ReadOnlySpan`1[System.Char])",
- "System.ReadOnlySpan`1[System.Char] GetPathRoot(System.ReadOnlySpan`1[System.Char])",
"System.ReadOnlySpan`1[System.Char] TrimEndingDirectorySeparator(System.ReadOnlySpan`1[System.Char])",
"System.String Join(System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char])",
"System.String Join(System.String, System.String)",
diff --git a/version.json b/version.json
index 18f7ab10c..bb8d6cc6c 100644
--- a/version.json
+++ b/version.json
@@ -1,6 +1,6 @@
{
"$schema": "https://raw.githubusercontent.com/AArnott/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json",
- "version": "14.0",
+ "version": "15.0",
"assemblyVersion": {
"precision": "major"
},