Tôi muốn xóa một thư mục trong FTP và đó là các tập tin đệ quy.Làm thế nào để đệ quy xóa một thư mục với các tập tin trong bằng cách sử dụng FtpWebRequest?
Tôi có thể triển khai mã ví dụ nào?
Tôi muốn xóa một thư mục trong FTP và đó là các tập tin đệ quy.Làm thế nào để đệ quy xóa một thư mục với các tập tin trong bằng cách sử dụng FtpWebRequest?
Tôi có thể triển khai mã ví dụ nào?
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
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 :)
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:
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à:
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).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)
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;
}
}
}
}
Tôi vừa đăng tải một câu trả lời có trong bài viết này http://stackoverflow.com/questions/4797508/c-sharp-how-can-ftpclient-delete-a-directory/22623620#22623620 –