2010-03-08 118 views
5

假设我有一个svn存储库https://www.mysvn.com/svn/。我如何使用SharpSVN来确定服务器上是否存在远程文件夹https://www.mysvn.com/svn/a/b/c如何使用SharpSVN(快速)检查服务器上是否存在远程文件夹/文件

我需要这样做的一种方式,可以让我告诉连接失败(即服务器关闭)和文件夹完全没有创建之间的区别。

关于完整https://www.mysvn.com/svn/a/b/c路径的调用信息似乎没有给出例外情况,它使我能够区分没有存储库和仅存在缺失的文件夹。

我可以列出https://www.mysvn.com/svn/的所有文件,但是存储库可能很大,所以这可能需要很长时间。

现在我要做的第一个根网址,然后在完整的网址信息。如果根url失败,我把它当作服务器问题,但是如果成功并且完整的url失败,我会假设它是因为部分路径没有在服务器上创建。但是,如果两次检查或类似事件之间的互联网连接丢失,这可能会给出错误的答案。

回答

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 
+0

即时通讯目前与本地文件系统存储库测试(如URL是“文件:/// ”),并在这种情况下SharpSvn.SvnClient.List给我一个“SharpSvn.SvnRepositoryIOException:无法打开URL的ra_local会话” 当我喂它的存储库的URL附加了一个伪造的相对路径。给出一个完全虚假的url时,会抛出完全相同的异常。 – Ziphnor 2010-03-09 12:56:52

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

与斯特凡的答案新读者的后续行动,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); 
} 
相关问题