C#如何操控FTP

来源:互联网 发布:手机电子相册制作软件 编辑:程序博客网 时间:2024/05/21 06:48

C#如何操控FTP

关于FTP的应用免不了要对FTP进行增删查改什么的。通过搜索,整理和修改,自己写了一个FTP的Helper类。此篇文章目的有二(2最近流行)。

    • 累积代码,方便自己以后查阅使用;
    • 分享代码,方便他人使用。

以下是类:

FtpHelper.cs

 以下是重点说明:

如何获取某一目录下的文件和文件夹列表。

由于FtpWebRequest类只提供了WebRequestMethods.Ftp.ListDirectory方式和WebRequestMethods.Ftp.ListDirectoryDetails方式。这个方法获取到的是包含文件列表和文件夹列表的信息。并不是单单只包含某一类。为此我们需要分析获取信息的特点。分析发现,对于文件夹会有“<DIR>”这一项,而文件没有。所以我们可以根据这个来区分。一下分别是获取文件列表和文件夹列表的代码:

获取文件夹:

复制代码
/// <summary>/// 从ftp服务器上获得文件夹列表/// </summary>/// <param name="RequedstPath">服务器下的相对路径</param>/// <returns></returns>public static List<string> GetDirctory(string RequedstPath){    List<string> strs = new List<string>();    try    {        string uri = path + RequedstPath;   //目标路径 path为服务器地址        FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));        // ftp用户名和密码        reqFTP.Credentials = new NetworkCredential(username, password);        reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;        WebResponse response = reqFTP.GetResponse();        StreamReader reader = new StreamReader(response.GetResponseStream());//中文文件名        string line = reader.ReadLine();        while (line != null)        {            if (line.Contains("<DIR>"))            {                string msg = line.Substring(line.LastIndexOf("<DIR>")+5).Trim();                strs.Add(msg);            }            line = reader.ReadLine();        }        reader.Close();        response.Close();        return strs;    }    catch (Exception ex)    {        Console.WriteLine("获取目录出错:" + ex.Message);    }    return strs;}
复制代码

获取文件列表

复制代码
/// <summary>/// 从ftp服务器上获得文件列表/// </summary>/// <param name="RequedstPath">服务器下的相对路径</param>/// <returns></returns>public static List<string> GetFile(string RequedstPath){    List<string> strs = new List<string>();    try    {        string uri = path + RequedstPath;   //目标路径 path为服务器地址        FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));        // ftp用户名和密码        reqFTP.Credentials = new NetworkCredential(username, password);        reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;        WebResponse response = reqFTP.GetResponse();        StreamReader reader = new StreamReader(response.GetResponseStream());//中文文件名        string line = reader.ReadLine();        while (line != null)        {            if (!line.Contains("<DIR>"))            {                string msg = line.Substring(39).Trim();                strs.Add(msg);            }            line = reader.ReadLine();        }        reader.Close();        response.Close();        return strs;    }    catch (Exception ex)    {        Console.WriteLine("获取文件出错:" + ex.Message);    }    return strs;}
复制代码

其他代码并不需要过多的说明,注释已经说的相当明确了。

复制代码
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.IO;using System.Threading;namespace FtpSyn{    static public class FtpHelper    {        //基本设置        static private string path = @"ftp://" + Helper.GetAppConfig("obj") + "/";    //目标路径        static private string ftpip =Helper.GetAppConfig("obj");    //ftp IP地址        static private string username = Helper.GetAppConfig("username");   //ftp用户名        static private string password = Helper.GetAppConfig("password");   //ftp密码        //获取ftp上面的文件和文件夹        public static string[] GetFileList(string dir)        {            string[] downloadFiles;            StringBuilder result = new StringBuilder();            FtpWebRequest request;            try            {                request = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));                request.UseBinary = true;                request.Credentials = new NetworkCredential(username, password);//设置用户名和密码                request.Method = WebRequestMethods.Ftp.ListDirectory;                request.UseBinary = true;                WebResponse response = request.GetResponse();                StreamReader reader = new StreamReader(response.GetResponseStream());                string line = reader.ReadLine();                while (line != null)                {                    result.Append(line);                    result.Append("\n");                    Console.WriteLine(line);                    line = reader.ReadLine();                }                // to remove the trailing '\n'                result.Remove(result.ToString().LastIndexOf('\n'), 1);                reader.Close();                response.Close();                return result.ToString().Split('\n');            }            catch (Exception ex)            {                Console.WriteLine("获取ftp上面的文件和文件夹:" + ex.Message);                downloadFiles = null;                return downloadFiles;            }        }        /// <summary>        /// 获取文件大小        /// </summary>        /// <param name="file">ip服务器下的相对路径</param>        /// <returns>文件大小</returns>        public static int GetFileSize(string file)        {            StringBuilder result = new StringBuilder();            FtpWebRequest request;            try            {                request = (FtpWebRequest)FtpWebRequest.Create(new Uri(path + file));                request.UseBinary = true;                request.Credentials = new NetworkCredential(username, password);//设置用户名和密码                request.Method = WebRequestMethods.Ftp.GetFileSize;                int dataLength = (int)request.GetResponse().ContentLength;                return dataLength;            }            catch (Exception ex)            {                Console.WriteLine("获取文件大小出错:" + ex.Message);                return -1;            }        }        /// <summary>        /// 文件上传        /// </summary>        /// <param name="filePath">原路径(绝对路径)包括文件名</param>        /// <param name="objPath">目标文件夹:服务器下的相对路径 不填为根目录</param>        public static void FileUpLoad(string filePath,string objPath="")        {            try            {                string url = path;                if(objPath!="")                    url += objPath + "/";                try                {                    FtpWebRequest reqFTP = null;                    //待上传的文件 (全路径)                    try                    {                        FileInfo fileInfo = new FileInfo(filePath);                        using (FileStream fs = fileInfo.OpenRead())                        {                            long length = fs.Length;                            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url + fileInfo.Name));                            //设置连接到FTP的帐号密码                            reqFTP.Credentials = new NetworkCredential(username, password);                            //设置请求完成后是否保持连接                            reqFTP.KeepAlive = false;                            //指定执行命令                            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;                            //指定数据传输类型                            reqFTP.UseBinary = true;                            using (Stream stream = reqFTP.GetRequestStream())                            {                                //设置缓冲大小                                int BufferLength = 5120;                                byte[] b = new byte[BufferLength];                                int i;                                while ((i = fs.Read(b, 0, BufferLength)) > 0)                                {                                    stream.Write(b, 0, i);                                }                                Console.WriteLine("上传文件成功");                            }                        }                    }                    catch (Exception ex)                    {                        Console.WriteLine("上传文件失败错误为" + ex.Message);                    }                    finally                    {                    }                }                catch (Exception ex)                {                    Console.WriteLine("上传文件失败错误为" + ex.Message);                }                finally                {                }            }            catch (Exception ex)            {                Console.WriteLine("上传文件失败错误为" + ex.Message);            }        }                /// <summary>        /// 删除文件        /// </summary>        /// <param name="fileName">服务器下的相对路径 包括文件名</param>        public static void DeleteFileName(string fileName)        {            try            {                FileInfo fileInf = new FileInfo(ftpip +""+ fileName);                string uri = path + fileName;                FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));                // 指定数据传输类型                reqFTP.UseBinary = true;                // ftp用户名和密码                reqFTP.Credentials = new NetworkCredential(username, password);                // 默认为true,连接不会被关闭                // 在一个命令之后被执行                reqFTP.KeepAlive = false;                // 指定执行什么命令                reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();                response.Close();            }            catch (Exception ex)            {                Console.WriteLine("删除文件出错:" + ex.Message);            }        }                /// <summary>        /// 新建目录 上一级必须先存在        /// </summary>        /// <param name="dirName">服务器下的相对路径</param>        public static void MakeDir(string dirName)        {            try            {                string uri = path + dirName;                FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));                // 指定数据传输类型                reqFTP.UseBinary = true;                // ftp用户名和密码                reqFTP.Credentials = new NetworkCredential(username, password);                reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();                response.Close();            }            catch (Exception ex)            {                Console.WriteLine("创建目录出错:" + ex.Message);            }        }                /// <summary>        /// 删除目录 上一级必须先存在        /// </summary>        /// <param name="dirName">服务器下的相对路径</param>        public static void DelDir(string dirName)        {            try            {                string uri = path + dirName;                FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));                // ftp用户名和密码                reqFTP.Credentials = new NetworkCredential(username, password);                reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();                response.Close();            }            catch (Exception ex)            {                Console.WriteLine("删除目录出错:" + ex.Message);            }        }        /// <summary>        /// 从ftp服务器上获得文件夹列表        /// </summary>        /// <param name="RequedstPath">服务器下的相对路径</param>        /// <returns></returns>        public static List<string> GetDirctory(string RequedstPath)        {            List<string> strs = new List<string>();            try            {                string uri = path + RequedstPath;   //目标路径 path为服务器地址                FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));                // ftp用户名和密码                reqFTP.Credentials = new NetworkCredential(username, password);                reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;                WebResponse response = reqFTP.GetResponse();                StreamReader reader = new StreamReader(response.GetResponseStream());//中文文件名                string line = reader.ReadLine();                while (line != null)                {                    if (line.Contains("<DIR>"))                    {                        string msg = line.Substring(line.LastIndexOf("<DIR>")+5).Trim();                        strs.Add(msg);                    }                    line = reader.ReadLine();                }                reader.Close();                response.Close();                return strs;            }            catch (Exception ex)            {                Console.WriteLine("获取目录出错:" + ex.Message);            }            return strs;        }        /// <summary>        /// 从ftp服务器上获得文件列表        /// </summary>        /// <param name="RequedstPath">服务器下的相对路径</param>        /// <returns></returns>        public static List<string> GetFile(string RequedstPath)        {            List<string> strs = new List<string>();            try            {                string uri = path + RequedstPath;   //目标路径 path为服务器地址                FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));                // ftp用户名和密码                reqFTP.Credentials = new NetworkCredential(username, password);                reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;                WebResponse response = reqFTP.GetResponse();                StreamReader reader = new StreamReader(response.GetResponseStream());//中文文件名                string line = reader.ReadLine();                while (line != null)                {                    if (!line.Contains("<DIR>"))                    {                        string msg = line.Substring(39).Trim();                        strs.Add(msg);                    }                    line = reader.ReadLine();                }                reader.Close();                response.Close();                return strs;            }            catch (Exception ex)            {                Console.WriteLine("获取文件出错:" + ex.Message);            }            return strs;        }        }}
复制代码

希望对你有所帮助。

 

 

作者:Ron Ngai
出处:http://rondsny.github.io/rondsny/
关于作者:断码码农一枚。
欢迎转载,但未经作者同意须在文章页面明显位置给出原文连接
如有问题,可以通过rondsny#gmail.com 联系我,非常感谢。

分类: C#
好文要顶关注我 收藏该文联系我
Ron Ngai
关注 - 12
粉丝 - 111
+加关注
2
0
(请您对文章做出评价)
«上一篇:本地文件同步——C#源代码
»下一篇:《C#编程风格》还记得多少

posted on 2012-07-30 09:21 Ron Ngai 阅读(8436) 评论(7)编辑 收藏

评论

#1楼2012-07-30 10:51 Eric.Hu 

你好,能提供一下其中的Helper类吗?
static private string path = @"ftp://" + Helper.GetAppConfig("obj") + "/"; //目标路径
static private string ftpip =Helper.GetAppConfig("obj"); //ftp IP地址
static private string username = Helper.GetAppConfig("username"); //ftp用户名
static private string password = Helper.GetAppConfig("password"); //ftp密码
支持(0)反对(0)
http://pic.cnblogs.com/face/85528/20140606140412.png   

#2楼2012-07-30 11:07 飞无痕落无声 

@Eric.Hu
引用你好,能提供一下其中的Helper类吗?
static private string path = @"ftp://" + Helper.GetAppConfig("obj") + "/"; //目标路径
static private string ftpip =Helper.GetAppConfig("obj"); //ftp IP地址
static private string username = Helper.GetAppConfig("username"); //ftp用户名
static private string password = Helper.GetAppConfig("...

其实就是个获取配置文件的方法啊。。微软自己带的有啊,别人可能只是封装了下。。
支持(0)反对(0)
http://pic.cnblogs.com/face/27599/20130927104648.png   

#3楼[楼主]2012-07-30 12:47 Ron Ngai 

@飞无痕落无声
引用@Eric.Hu
引用引用你好,能提供一下其中的Helper类吗?
static private string path = @"ftp://" + Helper.GetAppConfig("obj") + "/"; //目标路径
static private string ftpip =Helper.GetAppConfig("obj"); //ftp IP地址
static private string username = Helper.GetAppConfig("username"); //ftp用户名
static private string password = Hel...

兄弟正解。
支持(0)反对(0)
http://pic.cnblogs.com/face/u211061.jpg?id=07192831   

#4楼2012-07-30 14:56 一滴血 

不错,多谢lz分享,
支持(0)反对(0)
http://pic.cnblogs.com/face/u76685.jpg?id=28154202   

#5楼2012-07-30 16:03 reavics 

FtpHelper.cs 没有啊,兄弟,劳烦提供下,学习一下你的FTP操作,很好的文章,谢谢分享!!!
支持(0)反对(0)
http://pic.cnblogs.com/face/97017/20140805162220.png   

#6楼[楼主]2012-07-30 16:43 Ron Ngai 

@reavics
引用FtpHelper.cs 没有啊,兄弟,劳烦提供下,学习一下你的FTP操作,很好的文章,谢谢分享!!!

Helper类只是我封装的一个很简单的类。没啥用处的。那些值你可以直接用真实的值替换掉的。我只是在helper类里面写了一个读取配置文件的方法而已。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.IO;
 
namespaceFtpSyn
{
    public static classHelper
    {
 
        /// <summary>
        /// 获取自定义配置的值
        /// </summary>
        /// <param name="strKey">键值</param>
        /// <returns>键值对应的值</returns>
        publicstatic stringGetAppConfig(stringstrKey)
        {
            foreach(string key in ConfigurationManager.AppSettings)
            {
                if(key == strKey)
                {
                    returnConfigurationManager.AppSettings[strKey];
                }
            }
            returnnull;
        }
 
    }
}





转自:
http://www.cnblogs.com/rond/archive/2012/07/30/2611295.html

0 0
原创粉丝点击