2009-05-13 8 views
56

Was ist eine einfache Möglichkeit, ein Verzeichnis auf einem FTP-Server mit C# zu erstellen?Wie erstelle ich ein Verzeichnis auf FTP-Server mit C#?

ich herausgefunden, wie eine Datei zu einem bereits vorhandenen Ordner wie folgt laden:

using (WebClient webClient = new WebClient()) 
{ 
    string filePath = "d:/users/abrien/file.txt"; 
    webClient.UploadFile("ftp://10.128.101.78/users/file.txt", filePath); 
} 

Wenn ich jedoch auf users/abrien hochladen möchten, erhalte ich eine WebException, dass die Datei nicht verfügbar ist. Ich nehme an, das ist, weil ich den neuen Ordner vor dem Hochladen meiner Datei erstellen muss, aber WebClient scheint keine Methoden zu haben, dies zu erreichen.

Antwort

90

Verwenden Sie FtpWebRequest, mit einer Methode von WebRequestMethods.Ftp.MakeDirectory.

Zum Beispiel:

using System; 
using System.Net; 

class Test 
{ 
    static void Main() 
    { 
     WebRequest request = WebRequest.Create("ftp://host.com/directory"); 
     request.Method = WebRequestMethods.Ftp.MakeDirectory; 
     request.Credentials = new NetworkCredential("user", "pass"); 
     using (var resp = (FtpWebResponse) request.GetResponse()) 
     { 
      Console.WriteLine(resp.StatusCode); 
     } 
    } 
} 
+1

Haben Sie Ideen, wie dies über einen HTTP-Proxy zu tun? (nicht unterstützt von FtpWebRequest) –

+0

Nicht wirklich, fürchte ich. Soweit ich mich erinnern kann, haben sie HTTP-Methoden in FTP-Befehle übersetzt - und ich kann mir keine entsprechende HTTP-Methode vorstellen :( –

+12

Ist es möglich, verschachtelte Verzeichnisse mit einem WebRequest zu erstellen? Ich versuche es zu machen "ftp://host.com/ExistingFolder/new1/new2", aber ich bekomme "WebException - 550" (Datei nicht gefunden, kein Zugriff) und weiß nicht, Wetter das ist der Grund. –

16

Etwas wie folgt aus:

// remoteUri points out an ftp address ("ftp://server/thefoldertocreate") 
WebRequest request = WebRequest.Create(remoteUri); 
request.Method = WebRequestMethods.Ftp.MakeDirectory; 
WebResponse response = request.GetResponse(); 

(ein bisschen spät, wie seltsam..)

+14

+1 für nur eine Sekunde hinter Jon Skeet. – Rudi

25

Hier ist die Antwort, wenn Sie verschachtelte Verzeichnisse erstellen möchten

Es gibt keine saubere Möglichkeit zu überprüfen, ob ein Ordner auf dem FTP vorhanden ist, so dass Sie Schleifen und Creat erstellen müssen e all der verschachtelte Struktur eines Ordner zu der Zeit

public static void MakeFTPDir(string ftpAddress, string pathToCreate, string login, string password, byte[] fileContents, string ftpProxy = null) 
    { 
     FtpWebRequest reqFTP = null; 
     Stream ftpStream = null; 

     string[] subDirs = pathToCreate.Split('/'); 

     string currentDir = string.Format("ftp://{0}", ftpAddress); 

     foreach (string subDir in subDirs) 
     { 
      try 
      { 
       currentDir = currentDir + "/" + subDir; 
       reqFTP = (FtpWebRequest)FtpWebRequest.Create(currentDir); 
       reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory; 
       reqFTP.UseBinary = true; 
       reqFTP.Credentials = new NetworkCredential(login, password); 
       FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 
       ftpStream = response.GetResponseStream(); 
       ftpStream.Close(); 
       response.Close(); 
      } 
      catch (Exception ex) 
      { 
       //directory already exist I know that is weak but there is no way to check if a folder exist on ftp... 
      } 
     } 
    } 
+0

Sehr gut und nützlich. –

+0

Was letzten zwei Parameter tun? Diese wird nicht in der Methode body.Ich verwendete die Methode ohne die letzte t Wo Parameter, konnte aber nur verschachtelte Verzeichnis bis zu 2 Ebene erstellen, danach bekam ich 505 Fehler. –

+0

gibt Fehler wie: Der Remote-Server einen Fehler zurückgegeben: (550) Datei nicht verfügbar (z. B. Datei nicht gefunden, kein Zugriff) .Plz Help Me .. –

Verwandte Themen