要删除空目录,请使用以下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();
}
Run Code Online (Sandbox Code Playgroud)
使用它像:
string url = "ftp://ftp.example.com/directory/todelete";
NetworkCredential credentials = new NetworkCredential("username", "password");
DeleteFtpDirectory(url, credentials);
Run Code Online (Sandbox Code Playgroud)
虽然它变得更复杂,但是如果你需要删除一个非空的目录.在FtpWebRequest类(或.NET框架中的任何其他FTP实现)中不支持递归操作.你必须自己实现递归:
棘手的部分是识别子目录中的文件.用便携式方式无法做到这一点FtpWebRequest.该FtpWebRequest遗憾的是不支持的MLSD命令,这是检索目录列表中的FTP协议与文件属性的唯一可移植的方法.另请参阅检查FTP服务器上的对象是文件还是目录.
你的选择是:
LISTcommand = ListDirectoryDetailsmethod)并尝试解析特定于服务器的列表.许多FTP服务器使用*nix风格的列表,您可以d在条目的最开头通过它来标识目录.但是许多服务器使用不同的格式.以下示例使用此方法(假设为*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();
}
Run Code Online (Sandbox Code Playgroud)
使用方法与上一个(平面)实现方式相同.
或者使用支持递归操作的第三方库.
例如,使用WinSCP .NET程序集,只需调用一次即可删除整个目录FtpWebRequest:
// 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();
}
Run Code Online (Sandbox Code Playgroud)
在内部,Session.RemoveFiles如果服务器支持,WinSCP将使用该命令.如果没有,它使用该MLSD命令并支持许多不同的列表格式.
(我是WinSCP的作者)
| 归档时间: |
|
| 查看次数: |
12947 次 |
| 最近记录: |