Skip to content

Commit 88fb0dd

Browse files
committed
Added string Extensions for EnsureLeadingSlash and EnsureTrailingSlash
1 parent b87f1d5 commit 88fb0dd

2 files changed

Lines changed: 203 additions & 4 deletions

File tree

src/Abstract.FileSystem/StringExtensions.cs

Lines changed: 97 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Text;
4-
1+

52
namespace Abstract.FileSystem
63
{
74
/// <summary>
@@ -38,5 +35,101 @@ public static string RemoveTrailingSlash(this string value)
3835

3936
return value;
4037
}
38+
39+
/// <summary>
40+
/// Add a leading slash or backslash based on the occurances in the string. If no slash is contained, the system default is added
41+
/// </summary>
42+
/// <param name="value"></param>
43+
/// <returns></returns>
44+
public static string EnsureLeadingSlash(this string value)
45+
{
46+
if (string.IsNullOrEmpty(value))
47+
{
48+
return value;
49+
}
50+
51+
var backslash = value.IndexOf(Separator.Backslash, System.StringComparison.Ordinal);
52+
if (backslash == 0)
53+
{
54+
return value;
55+
}
56+
57+
var slash = value.IndexOf(Separator.Slash, System.StringComparison.Ordinal);
58+
if (slash == 0)
59+
{
60+
return value;
61+
}
62+
63+
if (backslash > 0 && slash > 0)
64+
{
65+
if (backslash < slash)
66+
{
67+
return $"{Separator.Backslash}{value}";
68+
}
69+
70+
return $"{Separator.Slash}{value}";
71+
}
72+
73+
if (backslash > 0)
74+
{
75+
return $"{Separator.Backslash}{value}";
76+
}
77+
78+
if (slash > 0)
79+
{
80+
return $"{Separator.Slash}{value}";
81+
}
82+
83+
var separator = SystemPath.OsType == OsType.Unix ? Separator.Slash : Separator.Backslash;
84+
return $"{separator}{value}";
85+
}
86+
87+
/// <summary>
88+
/// Add a trailing slash or backslash based on the occurances in the string. If no slash is contained, the system default is added
89+
/// </summary>
90+
/// <param name="value"></param>
91+
/// <returns></returns>
92+
public static string EnsureTrailingSlash(this string value)
93+
{
94+
if (string.IsNullOrEmpty(value))
95+
{
96+
return value;
97+
}
98+
99+
if (value.EndsWith(Separator.Backslash))
100+
{
101+
return value;
102+
}
103+
104+
if (value.EndsWith(Separator.Slash))
105+
{
106+
return value;
107+
}
108+
109+
var backslash = value.LastIndexOf(Separator.Backslash, System.StringComparison.Ordinal);
110+
var slash = value.LastIndexOf(Separator.Slash, System.StringComparison.Ordinal);
111+
if (backslash >= 0 && slash >= 0)
112+
{
113+
if (backslash > slash)
114+
{
115+
return $"{value}{Separator.Backslash}";
116+
}
117+
118+
return $"{value}{Separator.Slash}";
119+
}
120+
121+
if (backslash >= 0)
122+
{
123+
return $"{value}{Separator.Backslash}";
124+
}
125+
126+
if (slash >= 0)
127+
{
128+
return $"{value}{Separator.Slash}";
129+
}
130+
131+
var separator = SystemPath.OsType == OsType.Unix ? Separator.Slash : Separator.Backslash;
132+
return $"{value}{separator}";
133+
}
41134
}
42135
}

src/Tests/Abstract.FileSystem.Test/StringExtensionsTests.cs

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,111 @@ public void StringExtensions_RemoveTrailingSlash_Backslash()
3131
{
3232
"\\test\\leading\\".RemoveTrailingSlash().Should().Be("\\test\\leading");
3333
}
34+
35+
36+
37+
38+
39+
[Test]
40+
public void StringExtensions_EnsureLeadingSlash_Backslash()
41+
{
42+
"test\\leading\\".EnsureLeadingSlash().Should().Be("\\test\\leading\\");
43+
}
44+
45+
[Test]
46+
public void StringExtensions_EnsureLeadingSlash_Slash()
47+
{
48+
"test/leading/".EnsureLeadingSlash().Should().Be("/test/leading/");
49+
}
50+
51+
[Test]
52+
public void StringExtensions_EnsureLeadingSlash_Backslash_Ok()
53+
{
54+
"\\test\\leading\\".EnsureLeadingSlash().Should().Be("\\test\\leading\\");
55+
}
56+
57+
[Test]
58+
public void StringExtensions_EnsureLeadingSlash_Slash_Ok()
59+
{
60+
"/test/leading/".EnsureLeadingSlash().Should().Be("/test/leading/");
61+
}
62+
63+
[Test]
64+
public void StringExtensions_EnsureLeadingSlash_Mix_Backslash()
65+
{
66+
"test\\leading/".EnsureLeadingSlash().Should().Be("\\test\\leading/");
67+
}
68+
69+
[Test]
70+
public void StringExtensions_EnsureLeadingSlash_Mix_Slash()
71+
{
72+
"test/leading\\".EnsureLeadingSlash().Should().Be("/test/leading\\");
73+
}
74+
75+
[Test]
76+
public void StringExtensions_EnsureLeadingSlash_System()
77+
{
78+
var separator = SystemPath.OsType == OsType.Unix ? "/" : "\\";
79+
$"test".EnsureLeadingSlash().Should().Be($"{separator}test");
80+
}
81+
82+
[Test]
83+
public void StringExtensions_EnsureLeadingSlash_Null()
84+
{
85+
((string)null).EnsureLeadingSlash().Should().BeNull();
86+
}
87+
88+
89+
90+
91+
92+
[Test]
93+
public void StringExtensions_EnsureTrailingSlash_Backslash()
94+
{
95+
"\\test\\leading".EnsureTrailingSlash().Should().Be("\\test\\leading\\");
96+
}
97+
98+
[Test]
99+
public void StringExtensions_EnsureTrailingSlash_Slash()
100+
{
101+
"/test/leading".EnsureTrailingSlash().Should().Be("/test/leading/");
102+
}
103+
104+
[Test]
105+
public void StringExtensions_EnsureTrailingSlash_Backslash_Ok()
106+
{
107+
"\\test\\leading\\".EnsureTrailingSlash().Should().Be("\\test\\leading\\");
108+
}
109+
110+
[Test]
111+
public void StringExtensions_EnsureTrailingSlash_Slash_Ok()
112+
{
113+
"/test/leading/".EnsureTrailingSlash().Should().Be("/test/leading/");
114+
}
115+
116+
[Test]
117+
public void StringExtensions_EnsureTrailingSlash_Mix_Backslash()
118+
{
119+
"\\test/leading".EnsureTrailingSlash().Should().Be("\\test/leading/");
120+
}
121+
122+
[Test]
123+
public void StringExtensions_EnsureTrailingSlash_Mix_Slash()
124+
{
125+
"/test\\leading".EnsureTrailingSlash().Should().Be("/test\\leading\\");
126+
}
127+
128+
[Test]
129+
public void StringExtensions_EnsureTrailingSlash_System()
130+
{
131+
var separator = SystemPath.OsType == OsType.Unix ? "/" : "\\";
132+
$"test".EnsureTrailingSlash().Should().Be($"test{separator}");
133+
}
134+
135+
[Test]
136+
public void StringExtensions_EnsureTrailingSlash_Null()
137+
{
138+
((string) null).EnsureTrailingSlash().Should().BeNull();
139+
}
34140
}
35141
}

0 commit comments

Comments
 (0)