C#通过FTP下载文件夹
答案:3 悬赏:0
解决时间 2021-02-17 19:18
- 提问者网友:说不出醉人情话
- 2021-02-17 09:23
如题,如何用C#代码,来下载FTP上的某个文件夹所有的东西呢?是文件夹,不是文件哦,大虾们多指点!!
最佳答案
- 二级知识专家网友:何必打扰
- 2021-02-17 10:53
下载FTP上的某个文件夹所有的东西呢?是文件夹,不是文件哦,”你是不是很矛盾?文件夹只是一个符号,最终的目的是文件是不是?遍历,然后用socket,
全部回答
- 1楼网友:时光挺欠揍
- 2021-02-17 12:39
有两个方法:1.文件夹打包成ZIP下载
2.在选择的下载目录下创建一个和FTP一样的目录,然后便利FTP上文件夹里所有的文件,然后下载到你创建的文件夹下面
- 2楼网友:心与口不同
- 2021-02-17 11:48
第一部分是实现单个文件下载的方法
/// <summary>
/// 单个文件下载方法
/// </summary>
/// <param name="adss">保存文件的本地路径</param>
/// <param name="ftpadss">下载文件的FTP路径</param>
public void download(string adss, string ftpadss)
{
//FileMode常数确定如何打开或创建文件,指定操作系统应创建新文件。
//FileMode.Create如果文件已存在,它将被改写
FileStream outputStream = new FileStream(adss, FileMode.Create);
FtpWebRequest downRequest = (FtpWebRequest)WebRequest.Create(new Uri(ftpadss));
//设置要发送到 FTP 服务器的命令
downRequest.Method = WebRequestMethods.Ftp.DownloadFile;
FtpWebResponse response = (FtpWebResponse)downRequest.GetResponse();
Stream ftpStream = response.GetResponseStream();
long cl = response.ContentLength;
int bufferSize = 2048;
int readCount;
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
outputStream.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
}
ftpStream.Close();
outputStream.Close();
response.Close();
}第二个部分也就是需要遍历出所指定的文件夹内所有内容
首先是一个单个遍历文件夹获取文件夹下所有文件信息的方法
/// </summary>
/// <param name="ftpads">FTP地址路径</param>
/// <param name="name">我们所选择的文件或者文件夹名字</param>
/// <param name="type">要发送到FTP服务器的命令</param>
/// <returns></returns>
public string[] ftp(string ftpads,string name,string type)
{
WebResponse webresp = null;
StreamReader ftpFileListReader = null;
FtpWebRequest ftpRequest=null;
try
{
ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri(ftpads + name));
ftpRequest.Method = type;
webresp = ftpRequest.GetResponse();
ftpFileListReader = new StreamReader(webresp.GetResponseStream(), Encoding.Default);
}
catch(Exception ex)
{
ex.ToString();
}
StringBuilder str = new StringBuilder();
string line=ftpFileListReader.ReadLine();
while (line != null)
{
str.Append(line);
str.Append("/n");
line = ftpFileListReader.ReadLine();
}
string[] fen = str.ToString().Split('/n');
return fen;
}之后是一个我们实现递归文件夹的方法
/// <summary>
/// 下载方法KO
/// </summary>
/// <param name="ftpads">FTP路径</param>
/// <param name="name">需要下载文件路径</param>
/// <param name="Myads">保存的本地路径</param>
public void downftp(string ftpads, string name,string Myads)
{
string downloadDir = Myads + name;
string ftpdir = ftpads + name;
string[] fullname = ftp(ftpads, name, WebRequestMethods.Ftp.ListDirectoryDetails);
//判断是否为单个文件
if (fullname.Length <= 2)
{
if (fullname[fullname.Length - 1] == "")
{
download(downloadDir + "/" + name, ftpads + name + "/" + name);
}
}
else
{
string[] onlyname = ftp(ftpads, name, WebRequestMethods.Ftp.ListDirectory);
if (!Directory.Exists(downloadDir))
{
Directory.CreateDirectory(downloadDir);
}
foreach (string names in fullname)
{
//判断是否具有文件夹标识<DIR>
if (names.Contains("<DIR>"))
{
string olname = names.Split(new string[] { "<DIR>" },
StringSplitOptions.None)[1].Trim();
downftp(ftpdir, "//" + olname, downloadDir);
}
else
{
foreach (string onlynames in onlyname)
{
if (onlynames == "" || onlynames == " " || names == "")
{
break;
}
else
{
if (names.Contains(" " + onlynames))
{
download(downloadDir + "/" + onlynames, ftpads + name + "/" +
onlynames);
break;
}
}
}
}
}
}
} 在使用WebRequestMethods.Ftp.ListDirectoryDetails取得文件夹下所有内容时,会发现如果其中有文件夹,那么文件夹的的详细信息中会有一个"<DIR>"标识,我们就可以通过这个来将其区分开来
同时在获取文件夹以及文件名称时用到WebRequestMethods.Ftp.ListDirectory,这个指令能过只获得文件夹下所有文件包括文件夹的名字,通过这两个指令所获取的信息逐一比较,便能确定出文件或文件夹名以传递到download和downftp方法中
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
• 手机登qq时,显示手机磁盘不足,清理后重新登 |
• 刺客的套装怎么选啊? |