我需要在 SVN 存储库上远程创建目录。文件夹可以包含特殊字符,例如我的示例中的供应商、驱动程序和版本目录可以包含一个或多个加号(“+”)字符。
DoDontEscape()
只是将目录组合到一个 URL
DoEscape()
Uri.EscapeDataString()
在将其组合到 URI 之前在目录上使用- 引发“路径已存在”异常
在组合和构造对象之前,我是否需要Uri.EscapeDataString()
在每个目录上使用Uri
?或者只是组合和构造一个Uri
对象好吗?
我使用SharpSVN 库来远程创建目录和Flurl以组合到一个 URL。
代码
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" });
}