2010-03-08 66 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); 
} 
相關問題