2009-05-13 19 views
56

C#を使用してFTPサーバーにディレクトリを作成する簡単な方法はありますか?C#を使用してftpサーバーにディレクトリを作成するにはどうすればよいですか?

私はこのような既存のフォルダにファイルをアップロードする方法を考え出し:

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

私はusers/abrienにアップロードしたい場合は、私はファイルが利用できないと言ってWebExceptionを取得します。これは、ファイルをアップロードする前に新しいフォルダを作成する必要があるからだと思いますが、WebClientはそれを達成する方法がないようです。

答えて

90

FtpWebRequestWebRequestMethods.Ftp.MakeDirectoryの方法で使用してください。例えば

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

HTTPプロキシ経由でこれを行う方法に関するアイデアはありますか? (FtpWebRequestではサポートしていません) –

+0

本当に、私は恐れています。私はHTTPプロキシに取り組んで私の日で覚えていることから、彼らはFTPコマンドにHTTPメソッドを翻訳 - ?と私は同等のHTTPメソッドを考えることはできません:( –

+12

それは私が作るしようとしています1つのWebRequestクラスで、ネストされたディレクトリを作成することは可能です「ftp://host.com/ExistingFolder/new1/new2」が、私は取得しています。「WebException - 550」(ファイルが見つからない、アクセスなし)にして、これが理由で天気を知りませんが期待されて何 –

16

このような何か:あなたは、ネストされたディレクトリを作成したい場合は

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

(。。少し遅れてどのように奇数)

+14

+1はJon Skeetのすぐ後ろに1つあります。 – Rudi

25

ここでは、答えです

あなたがループし、レコード生成に持っているので、フォルダがFTP上に存在するかどうかを確認するために何のクリーンな方法はありませんすべての入れ子になった構造体を1つのフォルダにまとめます。

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

非常に便利で便利です –

+0

最後の2つのパラメータは何ですか?これらはメソッド本体では使用されません。私は505のエラーがあった後、2レベルまでの入れ子にされたディレクトリを作成することしかできませんでした。リモートサーバーがエラーを返しました: –

+0

それは次のようにエラーを返します(550)が利用できないファイル(例えば、ファイル、何のアクセスを発見しません).Plz私を助けて... –

関連する問題