2011-02-01 34 views

Trả lời

0

tốt đẹp chút Ví dụ, bạn có thể tìm thấy ở đây:

http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx

Trong ví dụ này họ đã sử dụng WebRequestMethods.Ftp.UploadFile lớp để chỉ đạo những loại hoạt động mà họ muốn làm.

Sử dụng phương pháp WebRequestMethods.Ftp.RemoveDirectory khi bạn có một xử lý trên thư mục cha bạn muốn xóa:

http://msdn.microsoft.com/en-us/library/system.net.webrequestmethods.ftp.aspx

10

Trước tiên, bạn phải liệt kê tất cả các file của bạn trong thư mục của bạn:

public static List<string> DirectoryListing(string Path, string ServerAdress, string Login, string Password) 
    { 
     FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + ServerAdress + Path); 
     request.Credentials = new NetworkCredential(Login, Password); 

     request.Method = WebRequestMethods.Ftp.ListDirectory;    

     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
     Stream responseStream = response.GetResponseStream(); 
     StreamReader reader = new StreamReader(responseStream); 

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

     while (!reader.EndOfStream) 
     { 
      result.Add(reader.ReadLine()); 
     } 

     reader.Close(); 
     response.Close(); 

     return result; 
    } 

Sau đó, bạn cần một phương pháp để xóa một tệp (vì bạn chỉ có thể xóa một thư mục nếu nó trống):

public static void DeleteFTPFile(string Path, string ServerAdress, string Login, string Password) 
    { 
     FtpWebRequest clsRequest = (System.Net.FtpWebRequest)WebRequest.Create("ftp://" + ServerAdress + Path); 
     clsRequest.Credentials = new System.Net.NetworkCredential(Login, Password); 

     clsRequest.Method = WebRequestMethods.Ftp.DeleteFile; 

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

Và cuối cùng:

public static void DeleteFTPDirectory(string Path, string ServerAdress, string Login, string Password) 
{ 
     FtpWebRequest clsRequest = (System.Net.FtpWebRequest)WebRequest.Create("ftp://" + ServerAdress + Path); 
     clsRequest.Credentials = new System.Net.NetworkCredential(Login, Password); 

     List<string> filesList = DirectoryListing(Path, ServerAdress, Login, Password); 

     foreach (string file in filesList) 
     { 
      DeleteFTPFile(Path + file, ServerAdress, Login, Password); 
     } 

     clsRequest.Method = WebRequestMethods.Ftp.RemoveDirectory; 

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

Bạn có thể dễ dàng gọi đây là như thế (đối với tôi các phương pháp đó đang ở trong một lớp được gọi là "Ftp"):

Ftp.DeleteFTPDirectory (the_path_of_your_folder_in_ftp, your_server_address, your_ftp_login, your_ftp_password);

Tất nhiên, bạn sẽ cần phải tùy chỉnh những dòng này, nhưng nó đã làm việc một cách hoàn hảo đối với tôi :)

4

Không có hỗ trợ cho các hoạt động đệ quy trong FtpWebRequest class (hoặc bất kỳ thực hiện FTP khác trong khuôn khổ NET). Bạn phải thực hiện đệ quy chính mình:

  • Danh sách thư mục ở xa
  • iterate mục, xóa các tập tin và thư mục con recursing vào (liệt kê chúng lần nữa, vv)

phần Tricky là xác định tệp từ thư mục con. Không có cách nào để làm điều đó một cách di động với FtpWebRequest. Rất tiếc, FtpWebRequest không hỗ trợ lệnh MLSD, đây là cách duy nhất để truy xuất danh sách thư mục có thuộc tính tệp trong giao thức FTP. Xem thêm Checking if object on FTP server is file or directory.

lựa chọn của bạn là:

  • làm một thao tác trên một tên tập tin đó chắc chắn sẽ thất bại cho một tập tin và thành công cho thư mục (hoặc ngược lại). I E. bạn có thể thử tải xuống "tên". Nếu thành công, đó là một tập tin, nếu không thành công, đó là một thư mục. Nhưng điều đó có thể trở thành một vấn đề hiệu suất, khi bạn có một số lượng lớn các mục.
  • Bạn có thể may mắn và trong trường hợp cụ thể của mình, bạn có thể cho biết tệp từ thư mục theo tên tệp (tức làtất cả các tệp của bạn đều có phần mở rộng, trong khi các thư mục con không)
  • Bạn sử dụng danh sách thư mục dài (LIST lệnh = ListDirectoryDetails phương pháp) và thử phân tích danh sách máy chủ cụ thể. Nhiều máy chủ FTP sử dụng danh sách * nix-style, trong đó bạn xác định một thư mục theo số d ở đầu mục nhập. Nhưng nhiều máy chủ sử dụng một định dạng khác. Ví dụ sau sử dụng phương pháp này (giả sử định dạng * nix).
  • Trong trường hợp cụ thể này, bạn chỉ có thể thử xóa mục nhập dưới dạng tệp. Nếu xóa không thành công, hãy thử liệt kê mục nhập dưới dạng thư mục. Nếu danh sách thành công, bạn cho rằng đó là một thư mục và tiến hành tương ứng. Thật không may một số máy chủ không lỗi, khi bạn cố gắng liệt kê một tập tin. Họ sẽ chỉ trả lại một danh sách với một mục duy nhất cho tệp.
static void DeleteFtpDirectory(string url, NetworkCredential credentials) 
{ 
    FtpWebRequest listRequest = (FtpWebRequest)WebRequest.Create(url); 
    listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 
    listRequest.Credentials = credentials; 

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

    using (FtpWebResponse listResponse = (FtpWebResponse)listRequest.GetResponse()) 
    using (Stream listStream = listResponse.GetResponseStream()) 
    using (StreamReader 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 
     { 
      FtpWebRequest deleteRequest = (FtpWebRequest)WebRequest.Create(fileUrl); 
      deleteRequest.Method = WebRequestMethods.Ftp.DeleteFile; 
      deleteRequest.Credentials = credentials; 

      deleteRequest.GetResponse(); 
     } 
    } 

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

    removeRequest.GetResponse(); 
} 

Các url nên giống như ftp://example.com/directory/to/delete/


Hoặc sử dụng một thư viện của bên thứ 3 để hỗ trợ hoạt động đệ quy.

Ví dụ với WinSCP .NET assembly bạn có thể xóa toàn bộ thư mục với một cuộc gọi duy nhất để 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("/home/user/foldertoremove").Check(); 
} 

Bên trong, WinSCP sử dụng lệnh MLSD, nếu được hỗ trợ bởi máy chủ. Nếu không, nó sử dụng lệnh LIST và hỗ trợ hàng chục định dạng danh sách khác nhau.

(Tôi là tác giả của WinSCP)

0

Không ai trong số các giải pháp thực sự làm việc trên các loại khác nhau của máy chủ trừ sử dụng System.Net.FtpClient

using System.Net.FtpClient; 
static void DeleteFtpDirectoryAndContent(string host, string path, NetworkCredential credentials, string dontDeleteFileUrl) 
    { 
     using (FtpClient conn = new FtpClient()) 
     { 
      conn.Host = host; 
      conn.Credentials = credentials; 

      foreach (FtpListItem item in conn.GetListing(path, FtpListOption.AllFiles | FtpListOption.ForceList)) 
      { 

       switch (item.Type) 
       { 
        case FtpFileSystemObjectType.Directory: 
         conn.DeleteDirectory(item.FullName, true, FtpListOption.AllFiles | FtpListOption.ForceList); 
         break; 
        case FtpFileSystemObjectType.File: 
         if (!dontDeleteFileUrl.EndsWith(item.FullName, StringComparison.InvariantCultureIgnoreCase)) 
          conn.DeleteFile(item.FullName); 
         break; 
       } 
      } 

     } 
    } 
Các vấn đề liên quan