2008-12-07 8 views

Antwort

100
var request = (FtpWebRequest)WebRequest.Create 
    ("ftp://ftp.domain.com/doesntexist.txt"); 
request.Credentials = new NetworkCredential("user", "pass"); 
request.Method = WebRequestMethods.Ftp.GetFileSize; 

try 
{ 
    FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
} 
catch (WebException ex) 
{ 
    FtpWebResponse response = (FtpWebResponse)ex.Response; 
    if (response.StatusCode == 
     FtpStatusCode.ActionNotTakenFileUnavailable) 
    { 
     //Does not exist 
    } 
} 

In der Regel ist es eine schlechte Idee Ausnahmen für Funktionalität in Ihrem Code wie diese, aber in diesem Fall zu verwenden, ich glaube, es ist ein Gewinn für Pragmatismus. Die Anrufliste für das Verzeichnis hat das Potenzial, wesentlich ineffizienter zu sein als die Verwendung von Ausnahmen auf diese Weise.

Wenn nicht, dann sei dir bewusst, dass es keine gute Übung ist!

EDIT: "Es funktioniert für mich!"

Dies scheint auf den meisten FTP-Servern zu funktionieren, aber nicht alle. Einige Server müssen "TYPE I" senden, bevor der SIZE-Befehl funktioniert. Man hätte gedacht, dass das Problem gelöst werden soll, wie folgt:

request.UseBinary = true; 

Leider ist es eine von Design-Einschränkung (big fat Fehler!), Es sei denn FtpWebRequest ist entweder das Herunterladen oder Hochladen einer Datei es nicht „TYPE I sendet ". Siehe Diskussion und Microsoft Antwort here.

Ich würde stattdessen die Verwendung der folgenden WebRequestMethod empfehlen, das funktioniert für mich auf allen Servern, die ich getestet habe, auch solche, die eine Dateigröße nicht zurückgeben würden.

WebRequestMethods.Ftp.GetDateTimestamp 
+0

Hallo, Ich habe meinen Benutzer und mein Passwort und setzen Sie meine URI. Datei existiert, aber dieser Code zeigt an, dass sie nicht existiert –

+2

Sie sind wahrlich ein geniales Ideal! Es wirkt wie ein Zauber! –

+0

@ user42467, gibt es einen Grund, FtpWebResponse response = (FtpWebResponse) request.GetResponse(); innerhalb des Versuchs, anstatt nur request.GetResponse(); – Daniel

4

Da

request.Method = WebRequestMethods.Ftp.GetFileSize 

Mai in einigen Fällen fehlschlägt (550: SIZE nicht im ASCII-Modus erlaubt), können Sie nur Timestamp statt überprüfen.

reqFTP.Credentials = new NetworkCredential(inf.LogOn, inf.Password); 
reqFTP.UseBinary = true; 
reqFTP.Method = WebRequestMethods.Ftp.GetDateTimestamp; 
0

ich FTPStatusCode.FileActionOK verwenden zu überprüfen, ob Datei ... dann

existiert, in der "else" Abschnitt, return false.

Verwandte Themen