1

我需要在 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" });
}
4

1 回答 1

0

Flurl 对Url.Combine路径段的编码方式非常保守。如果您包含保留字符(具有特殊含义的字符,例如“/”或“+”),它将假定您希望按原样包含它们并且不会对它们进行编码。它只会编码非法字符,例如空格。

我猜你想在这里编码保留字符,所以你的DoEscape()方法看起来是正确的。请注意,Flurl 有自己的编码方法,Url.Encode它与 非常相似,Uri.EscapeDataString只是它克服了一些可能会或可能不会影响您的怪癖。即:

  1. Uri.EscapeDataString当您达到 65,520 个字符时抛出异常;Url.Encode才不是。

  2. Uri.EscapeDataString没有为您提供将空格编码为“+”的选项;Url.Encode做。

于 2018-04-25T21:19:44.657 回答