5

https://www.mysvn.com/svn/に svn リポジトリがあるとします。SharpSVN を使用して、リモート フォルダーhttps://www.mysvn.com/svn/a/b/cがサーバーに存在するかどうかを確認するにはどうすればよいですか?

接続の失敗 (つまり、サーバーのダウン) と、フォルダーがまだ作成されていないこととの違いを区別できるようにする必要があります。

完全なhttps://www.mysvn.com/svn/a/b/cパスで情報を呼び出しても、リポジトリがまったくない場合とフォルダーが見つからない場合の違いを区別できる例外は発生しないようです。

https://www.mysvn.com/svn/のすべてのファイルを一覧表示できますが、リポジトリが非常に大きくなりすぎて、時間がかかりすぎる可能性があります。

現在、最初にルート URL、次に完全な URL に関する情報を作成しています。ルート URL が失敗した場合はサーバーの問題として扱いますが、成功して完全な URL が失敗した場合は、パスの一部がサーバー上に作成されていないためと想定します。ただし、2 つのチェックの間にインターネット接続が失われた場合など、これは間違った応答を返す可能性があります。

4

3 に答える 3

13

GetInfo を使用して SvnInfoArgs.ThrowOnError を false に設定することは可能です。

SharpSVN 構文の使用:

    using (SvnClient sc = new SvnClient())
    {
        Uri targetUri = new Uri(RemoteUriTrunk, relPath);
        var target = SvnTarget.FromUri(targetUri);
        Collection<SvnInfoEventArgs> info;
        bool result = sc.GetInfo(target, new SvnInfoArgs {ThrowOnError = false}, out info);
        Assert.That(result, Is.False);
        Assert.That(info, Is.Empty);
    }

ただし、スローされるすべての例外は、リモート ファイルが存在しないことを意味すると想定しています。

おそらく SvnRemoteSession.GetStat がこれを解決するためのより良い方法です。どうやら私はかなり新しい機能です。私のバージョンのライブラリにはありません。 http://sharpsvn.open.collab.net/source/browse/sharpsvn/trunk/src/SharpSvn/SvnRemoteSession.h?view=log

ライブラリがリポジトリの種類に応じて異なる例外をスローするのは非常にイライラします。

于 2010-12-21T14:10:16.810 に答える
2

そうしませんかsvn list https://www.mysvn.com/svn/a/b/c(または、同等のバインディングで)それを行いますか?パスが見つからない場合は、別のものを返す必要があります。たとえば、コマンド ライン クライアントは次を返します。

svn: URL 'https://www.mysvn.com/svn/a/b/c' non-existent in that revision
于 2010-03-08T20:50:23.533 に答える
1

新しい読者のためのStefanの回答をフォローアップすると、 SvnRemoteSession.GetStat がうまくいくようです:

using (var session = new SharpSvn.Remote.SvnRemoteSession())
{
    SvnUI.Bind(session, new SvnUIBindArgs());

    // Throws 'SharpSvn.SvnRepositoryIOForbiddenException' if the server 
    // exists but the repo does not, or the user does not have read access.
    // (SVN_ERR_RA_DAV_FORBIDDEN)
    // 
    // Throws 'SharpSvn.SvnSystemException' if the server does not exist
    // or could not be reached. (WSAHOST_NOT_FOUND)
    session.Open(remoteUriTrunk);

    SharpSvn.Remote.SvnRemoteStatEventArgs result;

    // True if the file or folder exists, false if it does not exist.
    bool exists = session.GetStat(relPath, out result);
}
于 2015-01-20T01:03:15.047 に答える