C#FTP操作

使用系统自带的wininet.dll,对FTP进行文件的查询,下载,上传,文件夹遍历操作。


/// <summary>
    /// 
    /// </summary>
    public static class APIs
    {
        [DllImport("wininet.dll")]
        public static extern int InternetOpen(string lpszCallerName, int dwAccessType, string lpszProxyName, string lpszProxyBypass, int dwFlags);

        [DllImport("wininet.dll")]
        public static extern int InternetConnect(int hInternetSession, string lpszServerName, int nProxyPort, string lpszUsername, string lpszPassword, int dwService, int dwFlags, int dwContext);

        [DllImport("wininet.dll", CharSet = CharSet.Ansi)]
        public static extern int FtpFindFirstFile(int hConnect, string lpszSearchFile, [In, Out] FileData dirData, ulong ulFlags, ulong ulContext);

        [DllImport("wininet.dll")]
        public static extern int FtpGetFile(int hConnect, string lpszRemoteFile, string lpszNewFile, int fFailIfExists, int dwFlagsAndAttributes, uint dwFlags, int dwContext);

        [DllImport("wininet.dll")]
        public static extern bool FtpDeletefile(int hConnect, string lpszFileName);

        [DllImport("wininet.dll")]
        public static extern int InternetCloseHandle(int hInet);

        [DllImport("wininet.dll")]
        public static extern int FtpPutFile(int hConnect, string lpszLocalFile, string lpszNewRemoteFile, uint dwFlags, int dwContext);

        [DllImport("wininet.dll", CharSet = CharSet.Ansi)]
        public static extern int FtpSetCurrentDirectoryA(int hConnect, string lpszDirectory);

        [DllImport("wininet.dll", CharSet = CharSet.Ansi)]
        public static extern int InternetFindNextFileA(int hFind, [In, Out]FileData lpvFindData);
    }

/// <summary>
    /// 
    /// </summary>
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public class FileData
    {
        public int fileAttributes = 0;
        public int creationTime_lowDateTime = 0;
        public int creationTime_highDateTime = 0;
        public int lastAccessTime_lowDateTime = 0;
        public int lastAccessTime_highDateTime = 0;
        public int lastWriteTime_lowDateTime = 0;
        public int lastWriteTime_highDateTime = 0;
        public int nFileSizeHigh = 0;
        public int nFileSizeLow = 0;
        public int dwReserved0 = 0;
        public int dwReserved1 = 0;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        public String fileName = null;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
        public String alternateFileName = null;
    }

public static class FtpOperator
    {
        private static List<FolderInfo> ListSubDir = null;
        private static List<string> ListSubFile = null;

        /// <summary>
        /// 
        /// </summary>
        public struct FolderInfo
        {
            public string FolderName;
            public string FolderPath;
            public int Level;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="ftpFile"></param>
        /// <returns></returns>
        public static bool FtpFileExist(String ftpFile)
        {
            //变量声明
            bool result = false;
            int lnghInet = 0;
            int lnghConnect = 0;

            try
            {
                //初期化FTP的连接
                lnghInet = APIs.InternetOpen("FtpOperator", 1, null, null, 0);

                //连接FTP
                lnghConnect = APIs.InternetConnect(lnghInet, "192.168.0.1", 21, "UserName", "Password", 1, 0, 0);

                //结果的判断
                if (lnghInet == 0 || lnghConnect == 0)
                {
                    result = false;
                    return result;
                }

                //FTP文件查询
                FileData foundData = new FileData();
                int hFind = APIs.FtpFindFirstFile(lnghConnect, ftpFile, foundData, 0x80000000, 0);

                //查询结果判断
                if (hFind != 0)
                {
                    result = true;
                }
                else
                {
                    result = false;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("FtpFileExist Error:" + ex.Message);
                result = false;
                return result;
            }
            finally
            {
                //FTP连接关闭
                if (lnghInet != 0)
                {
                    APIs.InternetCloseHandle(lnghInet);
                }

                //FTP连接关闭
                if (lnghConnect != 0)
                {
                    APIs.InternetCloseHandle(lnghConnect);
                }
            }

            //返回执行结果
            return result;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="ftpFileFullName"></param>
        /// <param name="localFileFullName"></param>
        /// <returns></returns>
        public static bool FtpFileDownLoad(string ftpFileFullName, string localFileFullName)
        {
            try
            {
                //初期化FTP的连接
                int lnghInet = APIs.InternetOpen("FtpOperator", 1, null, null, 0);

                //连接FTP
                int lnghConnect = APIs.InternetConnect(lnghInet, "192.168.0.1", 21, "UserName", "Password", 1, 0, 0);

                //取得指定文件
                long ret = APIs.FtpGetFile(lnghConnect, ftpFileFullName, localFileFullName, 0, 0x80, 0x80000000, 0);

                //判断执行结果
                if (ret == 0)
                {
                    return false;
                }

                //关闭连接
                APIs.InternetCloseHandle(lnghInet);
                APIs.InternetCloseHandle(lnghConnect);
            }
            catch
            {
                return false;
            }

            //返回结果
            return true;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="localFilePath"></param>
        /// <returns></returns>
        public static bool FtpFileUpLoad(string localFileFullName)
        {
            try
            {
                //设定上传文件在FTP上的保存路径和名称
                string ftpUpFullName = "/home/cadsvr/plan/plan14735/sa/123.txt";
                
                //检查本地文件是否存在
                if (File.Exists(localFileFullName) == false)
                {
                    return false;
                }

                //初始FTP连接
                int lnghInet = APIs.InternetOpen("FtpOperator", 1, null, null, 0);

                //连接FTP
                int lnghConnect = APIs.InternetConnect(lnghInet, "192.168.0.1", 21, "UserName", "Password", 1, 0, 0);

                //文件上传
                long ret = APIs.FtpPutFile(lnghConnect, localFileFullName, ftpUpFullName, 0x80000000, 0);

                //上传结果的判断
                if (ret == 0)
                {
                    return false;
                }

                //关闭FTP的连接
                APIs.InternetCloseHandle(lnghInet);
                APIs.InternetCloseHandle(lnghConnect);
            }
            catch
            {
                return false;
            }

            //返回结果
            return true;
        }

        
        public static bool FtpDirDownLoad(string sourceFolder, string destFolder)
        {
            //定义变量
            bool result = false;
            int lnghInet = 0;
            int lnghConnect = 0;
            ListSubDir = null;
            ListSubFile = null;

            try
            {
                //初始化FTP的连接
                lnghInet = APIs.InternetOpen("FtpOperator", 1, null, null, 0);

                //连接FTP
                lnghConnect = APIs.InternetConnect(lnghInet, "192.168.0.1", 21, "UserName", "Password", 1, 0, 0);

                //连接结果判断
                if (lnghInet == 0 || lnghConnect == 0)
                {
                    return false;
                }

                //查询最初的文件夹的内容
                GetFolderContent(lnghConnect, sourceFolder, 0);

                //通过循环,取得子文件夹下面所有的内容
                if (ListSubDir != null)
                {
                    int currentLevel = 0;
                    int stopIndex = 0;
                    int currentDirLength0 = 0;
                    int currentDirLength1 = 0;
                    int currentFileLength0 = 0;
                    int currentFileLength1 = 0;
                    bool findExist;
                    FolderInfo fi;

                    while (true)
                    {
                        findExist = false;
                        stopIndex = ListSubDir.Count;
                        currentDirLength0 = ListSubDir == null ? 0 : ListSubDir.Count;
                        currentFileLength0 = ListSubFile == null ? 0 : ListSubFile.Count;

                        for (int i = 0; i < stopIndex; i++)
                        {
                            fi = ListSubDir[i];

                            if (fi.Level == currentLevel)
                            {
                                GetFolderContent(lnghConnect, fi.FolderPath, currentLevel + 1);
                            }
                        }

                        currentDirLength1 = ListSubDir == null ? 0 : ListSubDir.Count;
                        currentFileLength1 = ListSubFile == null ? 0 : ListSubFile.Count;

                        //.通过文件夹和文件的List的长度,判断是否取得到新的文件或文件夹
                        if (currentDirLength0 != currentDirLength1 || currentFileLength0 != currentFileLength1)
                        {
                            findExist = true;
                        }
                        else
                        {
                            findExist = false;
                        }

                        //.如果没有取到,则退出;否则,继续循环
                        if (findExist == false)
                        {
                            break;
                        }
                        else
                        {
                            currentLevel++;
                        }
                    }

                    //在本地建立从FTP取到的子文件夹
                    result = CreateFtpFolder(ListSubDir, destFolder);

                    //如果文件夹建立成功,从FTP取得所有文件
                    if (result == true)
                    {
                        result = CreateFtpFile(lnghConnect, ListSubFile, destFolder);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("FtpDirDownLoad Error:" + ex.Message);
                result = false;
                return result;
            }
            finally
            {
                //连接关闭
                if (lnghInet != 0)
                {
                    APIs.InternetCloseHandle(lnghInet);
                }

                //连接关闭
                if (lnghConnect != 0)
                {
                    APIs.InternetCloseHandle(lnghConnect);
                }
            }

            //返回结果
            return result;
        }

        /// <summary>
        /// 取得指定FTP目录下所有的文件和文件夹
        /// </summary>
        /// <param name="connect"></param>
        /// <param name="source"></param>
        /// <param name="level"></param>
        private static void GetFolderContent(int connect, string source, int level)
        {
            //初始化变量
            if (ListSubDir == null)
            {
                ListSubDir = new List<FolderInfo>();
            }

            //初始化变量
            if (ListSubFile == null)
            {
                ListSubFile = new List<string>();
            }

            //变量定义
            FileData foundData = new FileData();
            int hFind = 0;

            //改变FTP当前文件夹
            int rst = APIs.FtpSetCurrentDirectoryA(connect, source);

            //判断文件夹定位是否成功
            if (rst != 0)
            {
                hFind = APIs.FtpFindFirstFile(connect, "*.*", foundData, 0x80000000, 0);

                //检索文件的结果判断
                if (hFind != 0)
                {
                    do
                    {
                        //如果是文件夹的时候
                        if (foundData.fileAttributes == 16)
                        {
                            FolderInfo fi = new FolderInfo();
                            fi.FolderName = foundData.fileName.TrimEnd('/') + "/";
                            fi.FolderPath = source.TrimEnd('/') + "/" + foundData.fileName.TrimEnd('/') + "/";
                            fi.Level = level;
                            ListSubDir.Add(fi);
                        }
                        else
                        {
                            ListSubFile.Add(source.TrimEnd('/') + "/" + foundData.fileName);
                        }
                    }
                    while (APIs.InternetFindNextFileA(hFind, foundData) != 0);
                }
                else
                {
                    return;
                }

                if (hFind != 0)
                {
                    APIs.InternetCloseHandle(hFind);
                }
            }
            else
            {
                return;
            }
        }

        /// <summary>
        /// 在本地建立从FTP上取得的文件夹
        /// </summary>
        /// <param name="source"></param>
        /// <param name="dest"></param>
        /// <returns></returns>
        private static bool CreateFtpFolder(List<FolderInfo> source, string dest)
        {
            if (source == null || source.Count == 0)
            {
                return true;
            }

            try
            {
                string path = null;

                foreach (FolderInfo fi in source)
                {
                    path = fi.FolderPath;

                    if (path == null || path.Trim() == "")
                    {
                        continue;
                    }

                    path = path.Trim('/').Replace("/", "\\");
                    path = Path.Combine(dest, path);

                    if (!Directory.Exists(path))
                    {
                        Directory.CreateDirectory(path);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("CreateFTPFolder Error:" + ex.Message);
                return false;
            }

            return true;
        }

        /// <summary>
        /// 在本地建立从FTP上取得的文件
        /// </summary>
        /// <param name="connect"></param>
        /// <param name="source"></param>
        /// <param name="dest"></param>
        /// <returns></returns>
        private static bool CreateFtpFile(int connect, List<string> source, string dest)
        {
            if (source == null || source.Count == 0)
            {
                return true;
            }

            try
            {
                string path = null;

                foreach (string s in source)
                {
                    path = s;

                    if (path == null || path.Trim() == "")
                    {
                        continue;
                    }

                    path = path.Trim('/').Replace("/", "\\");
                    path = Path.Combine(dest, path);

                    //检查路径是否存在
                    if (Directory.Exists(Path.GetDirectoryName(path)) == false)
                    {
                        Directory.CreateDirectory(Path.GetDirectoryName(path));
                    }

                    APIs.FtpGetFile(connect, s, path, 0, 0x80, 0x80000000, 0);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("CreateFtpFile:" + ex.Message);
                return false;
            }

            return true;
        }
    }


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值