4

単一の ftp 要求でサブディレクトリを含むディレクトリを作成する方法について、小さな問題が発生しました

私は文字列 s を持っています

    string s = "a/b/c/d"

注 : スラッシュ間の単語はランダムで、アイテムの数は不明です。

FTP サーバーにディレクトリ a/b/c/d を作成する方法????

これを達成するために私が使用している方法は、文字列を分割し、以下のコードを使用して各部分のフォルダーを作成することです:

    var ftpWebRequest = (FtpWebRequest)WebRequest.Create("ftp://domain.com/public_html/a");
    ftpWebRequest.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
    ftpWebRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
    ftpWebRequest.GetResponse();

次に、a 内に b ディレクトリを作成し、b 内に c を作成し、c 内に d を毎回コードを繰り返して作成します。

URLを直接入力してみました。お気に入り :

    var ftpWebRequest = (FtpWebRequest)WebRequest.Create("ftp://doemin.com/public_html/a/b/c/d);

しかし、うまくいきません。

1回のリクエストで他のサブディレクトリを含むフォルダを作成する方法について簡単な方法はありますか?

4

2 に答える 2

1

次のようなより使いやすいライブラリ (無料でオープン ソース) を使用する場合:

System.Net.FtpClient.dll

次に、このようなコードを書くことができます(例から適応)

static ManualResetEvent m_reset = new ManualResetEvent(false);
void Main()
{
    m_reset.Reset();
    using (FtpClient ftp = new FtpClient())
    {
        ftp.Host = "yourFTPHost.com";
        ftp.Credentials = new NetworkCredential("yourUserName", "yourPassword");
        ftp.SetWorkingDirectory("/rootForTest");
        if(ftp.DirectoryExists("test"))
            ftp.DeleteDirectory("test", true);
        ftp.BeginCreateDirectory("test/path/that/should/be/created", true,
                    new AsyncCallback(CreateDirectoryCallback), ftp);
        m_reset.WaitOne();
        ftp.Disconnect();
    }
}
static void CreateDirectoryCallback(IAsyncResult ar) 
{
    FtpClient ftp = ar.AsyncState as FtpClient;
    try 
    {
        if (ftp == null)
             throw new InvalidOperationException("The FtpControlConnection object is null!");
        ftp.EndCreateDirectory(ar);
    }
    catch (Exception ex) 
    {
        Console.WriteLine(ex.ToString());
    }
    finally 
    {
        m_reset.Set();
    }
}

補足: System.Net.FtpClient には完全な NET 4.0 Framework が必要です。(顧客プロファイルは十分ではありません)

于 2013-01-16T22:41:19.563 に答える
1

MKD a/b/c/d のような FTP コマンドをサポートするサーバーもあります。サーバーがサポートしていないが、SITE コマンドによるシェル コマンドの実行をサポートしている場合は、"SITE md a/b/c/d" を呼び出すことができます (ただし、これはマシン固有です)。上記のいずれも機能しない場合は、ループ内にフォルダを作成するか、このループを非表示にするライブラリを 1 つのメソッドで使用する必要があります。

于 2013-01-17T06:17:32.420 に答える