.NET中完成FTP各功能操作 (转)

1.FTP工厂类

using System;
using System.Configuration;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace School.Common
{
    
/// <summary>
    
/// 类 编 号: 0043
    
/// 类 名 称: FTPFactory 
    
/// 内容摘要: FTP工厂,完成FTP各功能操作
    
/// 完成日期: 2007-1-12 10:38:36
    
/// 编码作者: 林付国
    
/// </summary>

    public class FTPFactory
    
{
        
成员变量

        
构造方法

        
基本信息设置

        
属性

        
#region 功能操作

        
///
        
/// Return a string array containing the remote directory's file list.
        
///
        
///
        
///

        public string[] getFileList(string mask)
        


        
public string[] getFileList()
        


        
///
        
/// Return the size of a file.
        
///
        
///
        
///

        public long getFileSize(string fileName)
        


        
///
        
/// Login to the remote server.
        
///

        public void login()
        


        
///
        
/// If the value of mode is true, set binary mode for   downloads.
        
/// Else, set Ascii mode.
        
///
        
///

        public void setBinaryMode(Boolean mode)
        


        
///
        
/// Download a file to the Assembly's local directory,
        
/// keeping the same file name.
        
///
        
///

        public void download(string remFileName)
        


        
///
        
/// Download a remote file to the Assembly's local directory,
        
/// keeping the same file name, and set the resume flag.
        
///
        
///
        
///

        public void download(string remFileName, Boolean resume)
        


        
///
        
/// Download a remote file to a local file name which can   include
        
/// a path. The local file name will be created or overwritten,
        
/// but the path must exist.
        
///
        
///
        
///

        public void download(string remFileName, string locFileName)
        


        
///
        
/// Download a remote file to a local file name which can include
        
/// a path, and set the resume flag. The local file name will be
        
/// created or overwritten, but the path must exist.
        
///
        
///
        
///
        
///

        public void download(string remFileName, string locFileName, Boolean resume)
        


        
///
        
/// Upload a file.
        
///
        
///

        public void upload(string fileName)
        


        
///
        
/// Upload a file and set the resume flag.
        
///
        
///
        
///

        public void upload(string fileName, Boolean resume)
        


        
///
        
/// Delete a file from the remote FTP server.
        
///
        
///

        public void deleteRemoteFile(string fileName)
        


        
///
        
/// Rename a file on the remote FTP server.
        
///
        
///
        
///

        public void renameRemoteFile(string oldFileName, string newFileName)
        


        
///
        
/// Create a directory on the remote FTP server.
        
///
        
///

        public void mkdir(string dirName)
        
{
            
if (!logined)
            
{
                login();
            }

            sendCommand(
"MKD " + dirName);

            
if (retValue != 250)
            
{
                
throw new IOException(reply.Substring(4));
            }

        }


        
///
        
/// Delete a directory on the remote FTP server.
        
///
        
///

        public void rmdir(string dirName)
        
{
            
if (!logined)
            
{
                login();
            }


            sendCommand(
"RMD " + dirName);

            
if (retValue != 250)
            
{
                
throw new IOException(reply.Substring(4));
            }

        }


        
///
        
/// Change the current working directory on the remote FTP   server.
        
///
        
///

        public void chdir(string dirName)
        
{
            
if (dirName.Equals("."))
            
{
                
return;
            }

            
if (!logined)
            
{
                login();
            }

            sendCommand(
"CWD " + dirName);

            
if (retValue != 250)
            
{
                
throw new IOException(reply.Substring(4));
            }


            
this.remotePath = dirName;
            Console.WriteLine(
"Current directory is " + remotePath);
        }


        
///
        
/// Close the FTP connection.
        
///

        public void close()
        
{
            
if (clientSocket != null)
            
{
                sendCommand(
"QUIT");
            }

            cleanup();
            Console.WriteLine(
"Closing");
        }


        
///
        
/// Set debug mode.
        
///
        
///

        public void setDebug(Boolean debug)
        
{
            
this.debug = debug;
        }


        
private void readReply()
        
{
            mes 
= "";
            reply 
= readLine();
            retValue 
= Int32.Parse(reply.Substring(03));
        }


        
private void cleanup()
        
{
            
if (clientSocket != null)
            
{
                clientSocket.Close();
                clientSocket 
= null;
            }

            logined 
= false;
        }


        
private string readLine()
        
{
            
while (true)
            
{
                bytes 
= clientSocket.Receive(buffer, buffer.Length, 0);
                mes 
+= ASCII.GetString(buffer, 0, bytes);
                
if (bytes < buffer.Length)
                
{
                    
break;
                }

            }


            
char[] seperator = '\n' };
            
string[] mess = mes.Split(seperator);
            
if (mes.Length > 2)
            
{
                mes 
= mess[mess.Length - 2];
            }

            
else
            
{
                mes 
= mess[0];
            }


            
if (!mes.Substring(31).Equals(" "))
            
{
                
return readLine();
            }


            
if (debug)
            
{
                
for (int k = 0; k < mess.Length - 1; k++)
                
{
                    Console.WriteLine(mess[k]);
                }

            }

            
return mes;
        }


        
private void sendCommand(String command)
        
{
            Byte[] cmdBytes 
= Encoding.ASCII.GetBytes((command + "\r\n").ToCharArray());
            clientSocket.Send(cmdBytes, cmdBytes.Length, 
0);
            readReply();
        }


        
private Socket createDataSocket()
        
{
            sendCommand(
"PASV");
            
if (retValue != 227)
            
{
                
throw new IOException(reply.Substring(4));
            }


            
int index1 = reply.IndexOf('(');
            
int index2 = reply.IndexOf(')');
            
string ipData = reply.Substring(index1 + 1, index2 - index1 - 1);
            
int[] parts = new int[6];
            
int len = ipData.Length;
            
int partCount = 0;
            
string buf = "";

            
for (int i = 0; i < len && partCount <= 6; i++)
            
{
                
char ch = Char.Parse(ipData.Substring(i, 1));
                
if (Char.IsDigit(ch))
                    buf 
+= ch;
                
else if (ch != ',')
                
{
                    
throw new IOException("Malformed PASV reply: " + reply);
                }

                
if (ch == ',' || i + 1 == len)
                
{
                    
try
                    
{
                        parts[partCount
++= Int32.Parse(buf);
                        buf 
= "";
                    }

                    
catch (Exception)
                    
{
                        
throw new IOException("Malformed PASV reply: " + reply);
                    }

                }

            }


            
string ipAddress = parts[0+ "." + parts[1+ "." + parts[2+ "." + parts[3];
            
int port = (parts[4<< 8+ parts[5];

            Socket s 
= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 
5000);

            IPEndPoint ep 
= new IPEndPoint(Dns.Resolve(ipAddress).AddressList[0], port);

            
try
            
{
                s.Connect(ep);
            }

            
catch (Exception)
            
{
                
throw new IOException("Can't connect to remote   server");
            }

            
return s;
        }


        
#endregion


        
信息输出方法
    }

}

2.调用方法

 // 检查此FTP是否可用
                    FTPFactory ftp = new FTPFactory();
                    ftp.setRemoteHost(主机名);
                    ftp.setRemoteUser(用户名);
                    ftp.setRemotePass(密码);
                    ftp.setRemotePort(端口);
                    ftp.setRemotePath(路径);

                    ftp.login();

                    if (!ftp.GetLogin)
                    {
              // 提示连接失败
                        this.Cursor = Cursors.Default;
                        return;
                    }
                    ftp.close();
 

 

posted @ 2007-10-13 15:47  智慧园区-老朱  阅读(287)  评论(0编辑  收藏  举报