假设我在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失败,我会假设它,因为部分路径尚未在服务器上创建。但是,如果两次检查之间的互联网连接丢失,则可能会给出错误的答案。
答案 0 :(得分:11)
是否可以使用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
令人非常恼火的是,库会根据它的存储库类型抛出不同的异常。
答案 1 :(得分: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
答案 2 :(得分: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);
}