我需要在SVN存储库上远程创建目录。 文件夹可以包含特殊字符,例如我的示例中的供应商,驱动程序和版本目录可以包含一个或多个加号(“+”)字符。
DoDontEscape()
只是将目录合并到一个URL
DoEscape()
Uri.EscapeDataString()
在组合和构建Uri.EscapeDataString()
对象之前,是否需要在每个目录上使用Uri
?或者只是组合和构建Uri
对象OK?
我使用SharpSVN 用于远程创建目录的库和用于组合URL的Flurl。
代码
using SharpSvn;
using Flurl;
static readonly string reposRootString = @"https://my.svn.repos/Testing/";
static readonly string vendor = "Vendor";
static readonly string driver = "Driver+";
static readonly string version = "1.0.0.1";
static void Main(string[] args)
{
DoDontEscape();
DoEscape();
}
private static void DoDontEscape()
{
string combined = Url.Combine(reposRootString, vendor, driver, version);
TryCreateURI(combined);
}
private static void DoEscape()
{
var vEscaped = Uri.EscapeDataString(vendor);
var dEscaped = Uri.EscapeDataString(driver);
var dvEscaped = Uri.EscapeDataString(version);
string combined = Url.Combine(reposRootString, vEscaped, dEscaped, dvEscaped);
TryCreateURI(combined);
}
private static void TryCreateURI(string combined)
{
Uri uri;
if (Uri.TryCreate(combined, UriKind.Absolute, out uri))
{
CreateSvnDir(uri);
}
else
{
throw new Exception(string.Format("{0} is an invalid URI!", combined));
}
}
private static void CreateSvnDir(Uri uri)
{
using (SvnClient client = new SvnClient())
client.RemoteCreateDirectory(uri, new SvnCreateDirectoryArgs() { CreateParents = true, LogMessage = "create dir" });
}
答案 0 :(得分:0)
Flurl的Url.Combine
对其如何编码路径段非常保守。如果您包含保留字符(具有特殊含义的字符,例如" /"或" +"),则会假定您要将它们包括在内 - 是和不会对它们进行编码。它只会编码非法字符,例如空格。
我猜你想在这里编码保留字符,所以你的DoEscape()
方法看起来是正确的。请注意,Flurl有自己的编码方法Url.Encode
,它与Uri.EscapeDataString
非常相似,只是它克服了一些可能影响或不影响您的quirks。即:
Uri.EscapeDataString
会抛出异常; Url.Encode
没有。
Uri.EscapeDataString
没有为您提供将空格编码为" +&#34 ;; Url.Encode
确实如此。