2

FTPでフォルダを削除したい。

オブジェクトはそれを削除できFTPClientますか?

4

5 に答える 5

11

空のディレクトリを削除するには、次のRemoveDirectory「メソッド」を使用しFtpWebRequestます。

void DeleteFtpDirectory(string url, NetworkCredential credentials)
{
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
    request.Method = WebRequestMethods.Ftp.RemoveDirectory;
    request.Credentials = credentials;
    request.GetResponse().Close();
}

次のように使用します。

string url = "ftp://ftp.example.com/directory/todelete";
NetworkCredential credentials = new NetworkCredential("username", "password");
DeleteFtpDirectory(url, credentials);

空でないディレクトリを削除する必要がある場合は、さらに複雑になります。FtpWebRequestクラス (または .NET フレームワークのその他の FTP 実装) での再帰操作はサポートされていません。再帰を自分で実装する必要があります。

  • リモート ディレクトリを一覧表示する
  • エントリを繰り返し、ファイルを削除し、サブディレクトリに再帰します (それらを再度リストするなど)。

トリッキーな部分は、サブディレクトリからファイルを識別することです。を使用してポータブルな方法でそれを行う方法はありませんFtpWebRequest。残念ながら、 はこのコマンドをFtpWebRequestサポートしていませんMLSD。これは、FTP プロトコルでファイル属性を含むディレクトリ リストを取得する唯一のポータブルな方法です。FTP サーバー上のオブジェクトがファイルかディレクトリかの確認も参照してください。

オプションは次のとおりです。

  • ファイルでは失敗し、ディレクトリでは成功する (またはその逆) ことが確実なファイル名に対する操作を実行します。つまり、「名前」をダウンロードしてみることができます。成功すればファイル、失敗すればディレクトリです。ただし、多数のエントリがある場合は、パフォーマンスの問題になる可能性があります。
  • あなたは幸運かもしれません.あなたの特定のケースでは、ファイル名でディレクトリからファイルを知ることができます.
  • 長いディレクトリ リスト (LISTコマンド =ListDirectoryDetailsメソッド) を使用し、サーバー固有のリストを解析しようとしました。多くの FTP サーバーは *nix スタイルのリストを使用しておりd、エントリの先頭にある によってディレクトリを識別します。しかし、多くのサーバーは異なる形式を使用しています。次の例では、このアプローチを使用しています (*nix 形式を想定しています)。
  • この特定のケースでは、エントリをファイルとして削除することを試みることができます。削除に失敗した場合は、エントリをディレクトリとして一覧表示してみてください。リストが成功した場合は、それがフォルダーであると想定し、それに応じて続行します。残念ながら、ファイルを一覧表示しようとしてもエラーにならないサーバーもあります。ファイルの単一のエントリを含むリストを返すだけです。
static void DeleteFtpDirectory(string url, NetworkCredential credentials)
{
    var listRequest = (FtpWebRequest)WebRequest.Create(url);
    listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
    listRequest.Credentials = credentials;

    List<string> lines = new List<string>();

    using (var listResponse = (FtpWebResponse)listRequest.GetResponse())
    using (Stream listStream = listResponse.GetResponseStream())
    using (var listReader = new StreamReader(listStream))
    {
        while (!listReader.EndOfStream)
        {
            lines.Add(listReader.ReadLine());
        }
    }

    foreach (string line in lines)
    {
        string[] tokens =
            line.Split(new[] { ' ' }, 9, StringSplitOptions.RemoveEmptyEntries);
        string name = tokens[8];
        string permissions = tokens[0];

        string fileUrl = url + name;

        if (permissions[0] == 'd')
        {
            DeleteFtpDirectory(fileUrl + "/", credentials);
        }
        else
        {
            var deleteRequest = (FtpWebRequest)WebRequest.Create(fileUrl);
            deleteRequest.Method = WebRequestMethods.Ftp.DeleteFile;
            deleteRequest.Credentials = credentials;

            deleteRequest.GetResponse();
        }
    }

    var removeRequest = (FtpWebRequest)WebRequest.Create(url);
    removeRequest.Method = WebRequestMethods.Ftp.RemoveDirectory;
    removeRequest.Credentials = credentials;

    removeRequest.GetResponse();
}

以前の (フラットな) 実装と同じ方法で使用します。

Microsoft はFtpWebRequest新しい開発を推奨していませんが。


または、再帰操作をサポートするサードパーティ ライブラリを使用します。

たとえば、WinSCP .NET アセンブリを使用すると、以下を 1 回呼び出すだけでディレクトリ全体を削除できますSession.RemoveFiles

// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "example.com",
    UserName = "user",
    Password = "mypassword",
};

using (Session session = new Session())
{
    // Connect
    session.Open(sessionOptions);

    // Delete folder
    session.RemoveFiles("/directory/todelete").Check();
} 

MLSD内部的には、サーバーでサポートされている場合、WinSCP はコマンドを使用します。そうでない場合は、LISTコマンドを使用し、さまざまなリスト形式をサポートします。

(私は WinSCP の作者です)

于 2016-09-09T13:29:57.417 に答える
1

FtpWebRequest は、削除アクションを提供します。これを実現するためのコードは次のとおりです。

               FtpWebRequest reqFTP = FtpWebRequest.Create(uri);
                // Credentials and login handling...

                reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;

                string result = string.Empty;
                FtpWebResponse response = reqFTP.GetResponse();
                long size = response.ContentLength;
                Stream datastream = response.GetResponseStream();
                StreamReader sr = new StreamReader(datastream);
                result = sr.ReadToEnd();
                sr.Close();
                datastream.Close();
                response.Close();

ファイルとディレクトリで動作するはずです。実際、適切な権限があることを確認してください。

また、空でないフォルダは削除できませんでした。前にコンテンツを削除するには、それらを再帰的にトラバースする必要があります。

適切なアクセス許可の問題が原因でスローされる例外は、常に明確であるとは限りません...

于 2011-01-25T19:40:39.587 に答える
-2

大事なポイント

上記のように..

空でないフォルダは削除できませんでした。前にコンテンツを削除するには、それらを再帰的にトラバースする必要があります。

于 2014-02-13T13:01:50.473 に答える
-2
public void Deletedir(string remoteFolder)
{
    try
    {
        /* Create an FTP Request */
        ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/"+ remoteFolder);
        /* Log in to the FTP Server with the User Name and Password Provided */
        ftpRequest.Credentials = new NetworkCredential(user, pass);
        /* When in doubt, use these options */
        ftpRequest.UseBinary = true;***strong text***
        ftpRequest.UsePassive = true;
        ftpRequest.KeepAlive = true;
        /* Specify the Type of FTP Request */
        ftpRequest.Method = WebRequestMethods.Ftp.RemoveDirectory;
        /* Establish Return Communication with the FTP Server */
        ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
        /* Get the FTP Server's Response Stream */
        ftpStream = ftpResponse.GetResponseStream();
        /* Open a File Stream to Write the Downloaded File */
    }
    catch { }
}

それはあなたが使用できるコードです。そして、たとえばボタンクリックでそれを使用する方法は次のとおりです。

private void button5_Click(object sender, EventArgs e)
{
    ftp ftpClient = new ftp(@"SERVICE PROVIDER", "USERNAME", "PASSWORD");
    ftpClient.Deletedir("DIRECTORY U WANT TO DELETE");
}

そして、あなたのフォルダは空でなければならないことを覚えておいてください.

于 2015-04-08T18:49:50.080 に答える