博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# Ftp操作工具类
阅读量:5962 次
发布时间:2019-06-19

本文共 35185 字,大约阅读时间需要 117 分钟。

参考一:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
 
using System.Globalization;
 
namespace FtpTest1
{
 
    
public 
class FtpWeb
    {
        
string ftpServerIP;
        
string ftpRemotePath;
        
string ftpUserID;
        
string ftpPassword;
        
string ftpURI;
 
        
///
 
<summary>
        
///
 连接FTP
        
///
 
</summary>
        
///
 
<param name="FtpServerIP">
FTP连接地址
</param>
        
///
 
<param name="FtpRemotePath">
指定FTP连接成功后的当前目录, 如果不指定即默认为根目录
</param>
        
///
 
<param name="FtpUserID">
用户名
</param>
        
///
 
<param name="FtpPassword">
密码
</param>
        
public FtpWeb(
string FtpServerIP, 
string FtpRemotePath, 
string FtpUserID, 
string FtpPassword)
        {
            ftpServerIP = FtpServerIP;
            ftpRemotePath = FtpRemotePath;
            ftpUserID = FtpUserID;
            ftpPassword = FtpPassword;
            ftpURI = 
"
ftp://
" + ftpServerIP + 
"
/
" ;
        }
 
 
        
static 
void Main() {
            
//
string file = "c:\\aq3.gifa";
            
//
FileInfo fileInf = new FileInfo(file);
            
//
if (!fileInf.Exists)
            
//
{
            
//
    Console.WriteLine(file + " no exists");
            
//
}
            
//
else {
            
//
    Console.WriteLine("yes");
            
//
}
            
//
Console.ReadLine();
            FtpWeb fw = 
new FtpWeb(
"
121.11.65.10
"
""
"
aa1
"
"
aa
");
            
string[] filePaths = { 
"
c:\\aq3.gif1
"
"
c:\\aq2.gif1
"
"
c:\\bsmain_runtime.log
" };
            Console.WriteLine(fw.UploadFile(filePaths));
            Console.ReadLine();
        }
 
        
//
上传文件
        
public 
string UploadFile( 
string[] filePaths ) {
            StringBuilder sb = 
new StringBuilder();
            
if ( filePaths != 
null && filePaths.Length > 
0 ){
                
foreach
var file 
in filePaths ){
                    sb.Append(Upload( file ));
 
                }
            }
            
return sb.ToString();
        }
 
         
///
 
<summary>
        
///
 上传文件
        
///
 
</summary>
        
///
 
<param name="filename"></param>
        
private 
string Upload(
string filename)
        {
            FileInfo fileInf = 
new FileInfo(filename);
            
if ( !fileInf.Exists ){
                
return filename + 
"
 不存在!\n
";
            }
 
            
string uri = ftpURI + fileInf.Name;
            FtpWebRequest reqFTP;
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(
new Uri(uri));
 
            reqFTP.Credentials = 
new NetworkCredential(ftpUserID, ftpPassword);
            reqFTP.KeepAlive = 
false;
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
            reqFTP.UseBinary = 
true;
            reqFTP.UsePassive = 
false;  
//
选择主动还是被动模式
            
//
Entering Passive Mode
            reqFTP.ContentLength = fileInf.Length;
            
int buffLength = 
2048;
            
byte[] buff = 
new 
byte[buffLength];
            
int contentLen;
            FileStream fs = fileInf.OpenRead();
            
try
            {
                Stream strm = reqFTP.GetRequestStream();
                contentLen = fs.Read(buff, 
0, buffLength);
                
while (contentLen != 
0)
                {
                    strm.Write(buff, 
0, contentLen);
                    contentLen = fs.Read(buff, 
0, buffLength);
                }
                strm.Close();
                fs.Close();
            }
            
catch (Exception ex)
            {
                
return 
"
同步 
"+filename+
"
时连接不上服务器!\n
";
                
//
Insert_Standard_ErrorLog.Insert("FtpWeb", "Upload Error --> " + ex.Message);
            }
            
return 
"";
        }
 
 
        
///
 
<summary>
        
///
 下载
        
///
 
</summary>
        
///
 
<param name="filePath"></param>
        
///
 
<param name="fileName"></param>
        
public 
void Download(
string filePath, 
string fileName)
        {
            FtpWebRequest reqFTP;
            
try
            {
                FileStream outputStream = 
new FileStream(filePath + 
"
\\
" + fileName, FileMode.Create);
 
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(
new Uri(ftpURI + fileName));
                reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
                reqFTP.UseBinary = 
true;
                reqFTP.Credentials = 
new NetworkCredential(ftpUserID, ftpPassword);
                FtpWebResponse response = (FtpWebResponse)reqFTP.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();
            }
            
catch (Exception ex)
            {
                Insert_Standard_ErrorLog.Insert(
"
FtpWeb
"
"
Download Error --> 
" + ex.Message);
            }
        }
 
        
///
 
<summary>
        
///
 删除文件
        
///
 
</summary>
        
///
 
<param name="fileName"></param>
        
public 
void Delete(
string fileName)
        {
            
try
            {
                
string uri = ftpURI + fileName;
                FtpWebRequest reqFTP;
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(
new Uri(uri));
 
                reqFTP.Credentials = 
new NetworkCredential(ftpUserID, ftpPassword);
                reqFTP.KeepAlive = 
false;
                reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
 
                
string result = String.Empty;
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                
long size = response.ContentLength;
                Stream datastream = response.GetResponseStream();
                StreamReader sr = 
new StreamReader(datastream);
                result = sr.ReadToEnd();
                sr.Close();
                datastream.Close();
                response.Close();
            }
            
catch (Exception ex)
            {
                Insert_Standard_ErrorLog.Insert(
"
FtpWeb
"
"
Delete Error --> 
" + ex.Message + 
"
  文件名:
" + fileName);
            }
        }
 
        
///
 
<summary>
        
///
 获取当前目录下明细(包含文件和文件夹)
        
///
 
</summary>
        
///
 
<returns></returns>
        
public 
string[] GetFilesDetailList()
        {
            
string[] downloadFiles;
            
try
            {
                StringBuilder result = 
new StringBuilder();
                FtpWebRequest ftp;
                ftp = (FtpWebRequest)FtpWebRequest.Create(
new Uri(ftpURI));
                ftp.Credentials = 
new NetworkCredential(ftpUserID, ftpPassword);
                ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
                WebResponse response = ftp.GetResponse();
                StreamReader reader = 
new StreamReader(response.GetResponseStream());
                
string line = reader.ReadLine();
                line = reader.ReadLine();
                line = reader.ReadLine();
                
while (line != 
null)
                {
                    result.Append(line);
                    result.Append(
"
\n
");
                    line = reader.ReadLine();
                }
                result.Remove(result.ToString().LastIndexOf(
"
\n
"), 
1);
                reader.Close();
                response.Close();
                
return result.ToString().Split(
'
\n
');
            }
            
catch (Exception ex)
            {
                downloadFiles = 
null;
                Insert_Standard_ErrorLog.Insert(
"
FtpWeb
"
"
GetFilesDetailList Error --> 
" + ex.Message);
                
return downloadFiles;
            }
        }
 
        
///
 
<summary>
        
///
 获取当前目录下文件列表(仅文件)
        
///
 
</summary>
        
///
 
<returns></returns>
        
public 
string[] GetFileList(
string mask)
        {
            
string[] downloadFiles;
            StringBuilder result = 
new StringBuilder();
            FtpWebRequest reqFTP;
            
try
            {
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(
new Uri(ftpURI));
                reqFTP.UseBinary = 
true;
                reqFTP.Credentials = 
new NetworkCredential(ftpUserID, ftpPassword);
                reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
                WebResponse response = reqFTP.GetResponse();
                StreamReader reader = 
new StreamReader(response.GetResponseStream());
 
                
string line = reader.ReadLine();
                
while (line != 
null)
                {
                    
if (mask.Trim() != 
string.Empty && mask.Trim() != 
"
*.*
")
                    {
                        
string mask_ = mask.Substring(
0, mask.IndexOf(
"
*
"));
                        
if (line.Substring(
0, mask_.Length) == mask_)
                        {
                            result.Append(line);
                            result.Append(
"
\n
");
                        }
                    }
                    
else
                    {
                        result.Append(line);
                        result.Append(
"
\n
");
                    }
                    line = reader.ReadLine();
                }
                result.Remove(result.ToString().LastIndexOf(
'
\n
'), 
1);
                reader.Close();
                response.Close();
                
return result.ToString().Split(
'
\n
');
            }
            
catch (Exception ex)
            {
                downloadFiles = 
null;
                
if (ex.Message.Trim() != 
"
远程服务器返回错误: (550) 文件不可用(例如,未找到文件,无法访问文件)。
")
                {
                    Insert_Standard_ErrorLog.Insert(
"
FtpWeb
"
"
GetFileList Error --> 
" + ex.Message.ToString());
                }
                
return downloadFiles;
            }
        }
 
        
///
 
<summary>
        
///
 获取当前目录下所有的文件夹列表(仅文件夹)
        
///
 
</summary>
        
///
 
<returns></returns>
        
public 
string[] GetDirectoryList()
        {
            
string[] drectory = GetFilesDetailList();
            
string m = 
string.Empty;
            
foreach (
string str 
in drectory)
            {
                
if (str.Trim().Substring(
0
1).ToUpper() == 
"
D
")
                {
                    m += str.Substring(
54).Trim() + 
"
\n
";
                }
            }
 
            
char[] n = 
new 
char[] { 
'
\n
' };
            
return m.Split(n);
        }
 
        
///
 
<summary>
        
///
 判断当前目录下指定的子目录是否存在
        
///
 
</summary>
        
///
 
<param name="RemoteDirectoryName">
指定的目录名
</param>
        
public 
bool DirectoryExist(
string RemoteDirectoryName)
        {
            
string[] dirList = GetDirectoryList();
            
foreach (
string str 
in dirList)
            {
                
if (str.Trim() == RemoteDirectoryName.Trim())
                {
                    
return 
true;
                }
            }
            
return 
false;
        }
 
        
///
 
<summary>
        
///
 判断当前目录下指定的文件是否存在
        
///
 
</summary>
        
///
 
<param name="RemoteFileName">
远程文件名
</param>
        
public 
bool FileExist(
string RemoteFileName)
        {
            
string[] fileList = GetFileList(
"
*.*
");
            
foreach (
string str 
in fileList)
            {
                
if (str.Trim() == RemoteFileName.Trim())
                {
                    
return 
true;
                }
            }
            
return 
false;
        }
 
        
///
 
<summary>
        
///
 创建文件夹
        
///
 
</summary>
        
///
 
<param name="dirName"></param>
        
public 
void MakeDir(
string dirName)
        {
            FtpWebRequest reqFTP;
            
try
            {
                
//
 dirName = name of the directory to create.
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(
new Uri(ftpURI + dirName));
                reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
                reqFTP.UseBinary = 
true;
                reqFTP.Credentials = 
new NetworkCredential(ftpUserID, ftpPassword);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();
 
                ftpStream.Close();
                response.Close();
            }
            
catch (Exception ex)
            {
                Insert_Standard_ErrorLog.Insert(
"
FtpWeb
"
"
MakeDir Error --> 
" + ex.Message);
            }
        }
 
        
///
 
<summary>
        
///
 获取指定文件大小
        
///
 
</summary>
        
///
 
<param name="filename"></param>
        
///
 
<returns></returns>
        
public 
long GetFileSize(
string filename)
        {
            FtpWebRequest reqFTP;
            
long fileSize = 
0;
            
try
            {
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(
new Uri(ftpURI + filename));
                reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;
                reqFTP.UseBinary = 
true;
                reqFTP.Credentials = 
new NetworkCredential(ftpUserID, ftpPassword);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();
                fileSize = response.ContentLength;
 
                ftpStream.Close();
                response.Close();
            }
            
catch (Exception ex)
            {
                Insert_Standard_ErrorLog.Insert(
"
FtpWeb
"
"
GetFileSize Error --> 
" + ex.Message);
            }
            
return fileSize;
        }
 
        
///
 
<summary>
        
///
 改名
        
///
 
</summary>
        
///
 
<param name="currentFilename"></param>
        
///
 
<param name="newFilename"></param>
        
public 
void ReName(
string currentFilename, 
string newFilename)
        {
            FtpWebRequest reqFTP;
            
try
            {
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(
new Uri(ftpURI + currentFilename));
                reqFTP.Method = WebRequestMethods.Ftp.Rename;
                reqFTP.RenameTo = newFilename;
                reqFTP.UseBinary = 
true;
                reqFTP.Credentials = 
new NetworkCredential(ftpUserID, ftpPassword);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();
 
                ftpStream.Close();
                response.Close();
            }
            
catch (Exception ex)
            {
                Insert_Standard_ErrorLog.Insert(
"
FtpWeb
"
"
ReName Error --> 
" + ex.Message);
            }
        }
 
        
///
 
<summary>
        
///
 移动文件
        
///
 
</summary>
        
///
 
<param name="currentFilename"></param>
        
///
 
<param name="newFilename"></param>
        
public 
void MovieFile(
string currentFilename, 
string newDirectory)
        {
            ReName(currentFilename, newDirectory);
        }
参考二:
using System.IO;
using System.Net;
using System.Text;
using System.Diagnostics;
using System.Text.RegularExpressions;
    
//
从ftp上下载文件
    
private 
void Download(
string filePath, 
string ImageSrc, 
string ImageName, 
string ftpServerIP, 
string 
 
ftpUserName, 
string ftpPwd)
    {
        
if (!Directory.Exists(filePath))
        {
            Directory.CreateDirectory(filePath);
        }
        
using (FileStream OutputStream = 
new FileStream(filePath + 
"
\\
" + ImageName, FileMode.Create))
        {
            FtpWebRequest ReqFTP = (FtpWebRequest)FtpWebRequest.Create(
new Uri(
"
ftp://
" + ftpServerIP + 
"
/
" + 
ImageSrc));
            ReqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
            ReqFTP.UseBinary = 
true;
            ReqFTP.Credentials = 
new NetworkCredential(ftpUserName, ftpPwd);
            
using (FtpWebResponse response = (FtpWebResponse)ReqFTP.GetResponse())
            {
                
using (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();
                }
                response.Close();
            }
            OutputStream.Close();
        }
    }
        
//
从服务器上传文件到FTP上
    
private 
void UploadSmall(
string sFileDstPath, 
string FolderName, 
string ftpServerIP, 
string ftpUserName, 
string ftpPwd)
    {
        FileInfo fileInf = 
new FileInfo(sFileDstPath);
        FtpWebRequest reqFTP;
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(
new Uri(
"
ftp://
" + ftpServerIP + 
"
/
" + FolderName + 
"
/
" + 
fileInf.Name));
        reqFTP.Credentials = 
new NetworkCredential(ftpUserName, ftpPwd);
        reqFTP.KeepAlive = 
false;
        reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
        reqFTP.UseBinary = 
true;
        reqFTP.ContentLength = fileInf.Length;
        
int buffLength = 
2048;
        
byte[] buff = 
new 
byte[buffLength];
        
int contentLen;
        
using (FileStream fs = fileInf.OpenRead())
        {
            
using (Stream strm = reqFTP.GetRequestStream())
            {
                contentLen = fs.Read(buff, 
0, buffLength);
                
while (contentLen != 
0)
                {
                    strm.Write(buff, 
0, contentLen);
                    contentLen = fs.Read(buff, 
0, buffLength);
                }
                strm.Close();
            }
            fs.Close();
        }
    }
    
//
删除服务器上的文件
    
private 
void DeleteWebServerFile(
string sFilePath)
    {
        
if (File.Exists(sFilePath))
        {
            File.Delete(sFilePath);
        }
    }
    
//
删除FTP上的文件
    
private 
void DeleteFtpFile(
string[] IName, 
string FolderName, 
string ftpServerIP, 
string ftpUserName, 
string 
ftpPwd)
    {
        
foreach (
string ImageName 
in IName)
        {
            
string[] FileList = GetFileList(FolderName, ftpServerIP, ftpUserName, ftpPwd);
            
for (
int i = 
0; i < FileList.Length; i++)
            {
                
string Name = FileList[i].ToString();
                
if (Name == ImageName)
                {
                    FtpWebRequest ReqFTP;
                    ReqFTP = (FtpWebRequest)FtpWebRequest.Create(
new Uri(
"
ftp://
" + ftpServerIP + 
"
/
" + 
FolderName + 
"
/
" + ImageName));
                    ReqFTP.Credentials = 
new NetworkCredential(ftpUserName, ftpPwd);
                    ReqFTP.KeepAlive = 
false;
                    ReqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
                    ReqFTP.UseBinary = 
true;
                    
using (FtpWebResponse Response = (FtpWebResponse)ReqFTP.GetResponse())
                    {
                        
long size = Response.ContentLength;
                        
using (Stream datastream = Response.GetResponseStream())
                        {
                            
using (StreamReader sr = 
new StreamReader(datastream))
                            {
                                sr.ReadToEnd();
                                sr.Close();
                            }
                            datastream.Close();
                        }
                        Response.Close();
                    }
                }
            }
        }
    }
    
//
检查文件是否存在
    
public 
string[] GetFileList(
string FolderName, 
string ftpServerIP, 
string ftpUserName, 
string ftpPwd)
    {
        
string[] downloadFiles;
        StringBuilder result = 
new StringBuilder();
        FtpWebRequest reqFTP;
        
try
        {
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(
new Uri(
"
ftp://
" + ftpServerIP + 
"
/
" + FolderName + 
"
/
"));
            reqFTP.UseBinary = 
true;
            reqFTP.Credentials = 
new NetworkCredential(ftpUserName, ftpPwd);
            reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
            WebResponse response = reqFTP.GetResponse();
            StreamReader reader = 
new StreamReader(response.GetResponseStream());
            
string line = reader.ReadLine();
            
while (line != 
null)
            {
                result.Append(line);
                result.Append(
"
\n
");
                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)
        {
            downloadFiles = 
null;
            
return downloadFiles;
        }
    }
    
//
从客户端上传文件到FTP上
    
private 
void UploadFtp(HttpPostedFile sFilePath, 
string filename, 
string FolderName, 
string ftpServerIP, 
string ftpUserName, 
string ftpPwd)
    {
        
//
获取的服务器路径
        
//
FileInfo fileInf = new FileInfo(sFilePath);
        FtpWebRequest reqFTP;
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(
new Uri(
"
ftp://
" + ftpServerIP + 
"
/
" + FolderName + 
"
/
" + 
filename));
        reqFTP.Credentials = 
new NetworkCredential(ftpUserName, ftpPwd);
        reqFTP.KeepAlive = 
false;
        reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
        reqFTP.UseBinary = 
true;
        reqFTP.ContentLength = sFilePath.ContentLength;
        
//
设置缓存
        
int buffLength = 
2048;
        
byte[] buff = 
new 
byte[buffLength];
        
int contentLen;
        
using (Stream fs = sFilePath.InputStream)
        {
            
using (Stream strm = reqFTP.GetRequestStream())
            {
                contentLen = fs.Read(buff, 
0, buffLength);
                
while (contentLen != 
0)
                {
                    strm.Write(buff, 
0, contentLen);
                    contentLen = fs.Read(buff, 
0, buffLength);
                }
                strm.Close();
            }
            fs.Close();
        }
    }
    
//
创建目录
    
private 
void CreateDirectory(
string FolderName, 
string ftpServerIP, 
string ftpUserName, 
string ftpPwd)
    {
        
//
创建日期目录
        
try
        {
            FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(
new Uri(
"
ftp://
" + ftpServerIP + 
"
/
" + 
FolderName));
            reqFTP.UseBinary = 
true;
            reqFTP.Credentials = 
new NetworkCredential(ftpUserName, ftpPwd);
            reqFTP.KeepAlive = 
false;
            reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
        }
        
catch
        {
            ClientScript.RegisterStartupScript(
this.GetType(), 
""
"
<script>alert('系统忙,请稍后再
试!
'
);location.href=location.href;</script>");
        }
    }
    
//
检查日期目录和文件是否存在
    
private 
static Regex regexName = 
new Regex(
@"
[^\s]*$
", RegexOptions.Compiled);
    
private 
bool CheckFileOrPath(
string FolderName, 
string ftpServerIP, 
string ftpUserName, 
string ftpPwd)
    {
        
//
检查一下日期目录是否存在
        FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(
new Uri(
"
ftp://
" + ftpServerIP + 
"
/
"));
        reqFTP.UseBinary = 
true;
        reqFTP.Credentials = 
new NetworkCredential(ftpUserName, ftpPwd);
        reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
        Stream stream = reqFTP.GetResponse().GetResponseStream();
        
using (StreamReader sr = 
new StreamReader(stream))
        {
            
string line = sr.ReadLine();
            
while (!
string.IsNullOrEmpty(line))
            {
                GroupCollection gc = regexName.Match(line).Groups;
                
if (gc.Count != 
1)
                {
                    
throw 
new ApplicationException(
"
FTP 返回的字串格式不正确
");
                }
                
string path = gc[
0].Value;
                
if (path == FolderName)
                {
                    
return 
true;
                }
                line = sr.ReadLine();
            }
        }
        
return 
false;
    }
}
 
url:
参考三:
using
 System;
using
 System.Net;
using
 System.IO;
using
 System.Text;
using
 System.Net.Sockets;
/// 
<summary>
///
 FTPClient 的摘要说明。
/// 
</summary>
public 
class
 FTPClient
    
#region
 构造函数
/// 
<summary>
///
 缺省构造函数
/// 
</summary>
public
 FTPClient()
{
   strRemoteHost 
= 
""
;
   strRemotePath 
= 
""
;
   strRemoteUser 
= 
""
;
   strRemotePass 
= 
""
;
   strRemotePort 
= 
21
;
   bConnected     
= 
false
;
/// 
<summary>
///
 构造函数
/// 
</summary>
/// 
<param name="remoteHost"></param>
/// 
<param name="remotePath"></param>
/// 
<param name="remoteUser"></param>
/// 
<param name="remotePass"></param>
/// 
<param name="remotePort"></param>
public
 FTPClient(
string
 remoteHost, 
string
 remotePath, 
string
 remoteUser, 
string
 remotePass, 
int
 remotePort )
{
   strRemoteHost 
=
 remoteHost;
   strRemotePath 
=
 remotePath;
   strRemoteUser 
=
 remoteUser;
   strRemotePass 
=
 remotePass;
   strRemotePort 
=
 remotePort;
   Connect();
}
#endregion 
    
#region
 登陆
/// 
<summary>
///
 FTP服务器IP地址
/// 
</summary>
private 
string
 strRemoteHost;
public 
string
 RemoteHost
{
   
get
   {
    
return
 strRemoteHost;
   }
   
set
   {
    strRemoteHost 
=
 value;
   }
}
/// 
<summary>
///
 FTP服务器端口
/// 
</summary>
private 
int
 strRemotePort;
public 
int
 RemotePort
{
   
get
   {
    
return
 strRemotePort;
   }
   
set
   {
    strRemotePort 
=
 value;
   }
}
/// 
<summary>
///
 当前服务器目录
/// 
</summary>
private 
string
 strRemotePath;
public 
string
 RemotePath
{
   
get
   {
    
return
 strRemotePath;
   }
   
set
   {
    strRemotePath 
=
 value;
   }
}
/// 
<summary>
///
 登录用户账号
/// 
</summary>
private 
string
 strRemoteUser;
public 
string
 RemoteUser
{
   
set
   {
    strRemoteUser 
=
 value;
   }
}
/// 
<summary>
///
 用户登录密码
/// 
</summary>
private 
string
 strRemotePass;
public 
string
 RemotePass
{
   
set
   {
    strRemotePass 
=
 value;
   }
/// 
<summary>
///
 是否登录
/// 
</summary>
private
 Boolean bConnected;
public 
bool
 Connected
{
   
get
   {
    
return
 bConnected;
   }
}
#endregion 
    
#region
 链接
/// 
<summary>
///
 建立连接 
/// 
</summary>
public 
void
 Connect()
{
   socketControl 
= 
new
 Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
   IPEndPoint ep 
= 
new
 IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort);
   
//
 链接
   
try
   {
    socketControl.Connect(ep);
   }
   
catch
(Exception)
   {
    
throw 
new
 IOException(
"
Couldn't connect to remote server
"
);
   }   
//
 获取应答码
   ReadReply();
   
if
(iReplyCode 
!= 
220
)
   {
    DisConnect();
    
throw 
new
 IOException(strReply.Substring(
4
));
   }   
//
 登陆
   SendCommand(
"
USER 
"
+
strRemoteUser);
   
if
!
(iReplyCode 
== 
331 
||
 iReplyCode 
== 
230
) )
   {
    CloseSocketConnect();
//
关闭连接
    
throw 
new
 IOException(strReply.Substring(
4
));
   }
   
if
( iReplyCode 
!= 
230
 )
   {
    SendCommand(
"
PASS 
"
+
strRemotePass);
    
if
!
(iReplyCode 
== 
230 
||
 iReplyCode 
== 
202
) )
    {
     CloseSocketConnect();
//
关闭连接
     
throw 
new
 IOException(strReply.Substring(
4
));
    }
   }
   bConnected 
= 
true
;   
//
 切换到目录
   ChDir(strRemotePath);
}
      
/// 
<summary>
///
 关闭连接
/// 
</summary>
public 
void
 DisConnect()
{
   
if
( socketControl 
!= 
null
 )
   {
    SendCommand(
"
QUIT
"
);
   }
   CloseSocketConnect();
    
#endregion 
    
#region
 传输模式 
//
/ <summary>
///
 传输模式:二进制类型、ASCII类型
/// 
</summary>
public 
enum
 TransferType {Binary,ASCII}; 
/// 
<summary>
///
 设置传输模式
/// 
</summary>
/// 
<param name="ttType">
传输模式
</param>
public 
void
 SetTransferType(TransferType ttType)
{
   
if
(ttType 
==
 TransferType.Binary)
   {
    SendCommand(
"
TYPE I
"
);
//
binary类型传输
   }
   
else
   {
    SendCommand(
"
TYPE A
"
);
//
ASCII类型传输
   }
   
if
 (iReplyCode 
!= 
200
)
   {
    
throw 
new
 IOException(strReply.Substring(
4
));
   }
   
else
   {
    trType 
=
 ttType;
   }
}
/// 
<summary>
///
 获得传输模式
/// 
</summary>
/// 
<returns>
传输模式
</returns>
public
 TransferType GetTransferType()
{
   
return
 trType;
}
    
#endregion 
    
#region
 文件操作
/// 
<summary>
///
 获得文件列表
/// 
</summary>
/// 
<param name="strMask">
文件名的匹配字符串
</param>
/// 
<returns></returns>
public 
string
[] Dir(
string
 strMask)
{
   
//
 建立链接
   
if
(
!
bConnected)
   {
    Connect();
   }   
//
建立进行数据连接的socket
   Socket socketData 
=
 CreateDataSocket();
   
   
//
传送命令
   SendCommand(
"
NLST 
" 
+
 strMask);   
//
分析应答代码
   
if
(
!
(iReplyCode 
== 
150 
||
 iReplyCode 
== 
125 
||
 iReplyCode 
== 
226
))
   {
    
throw 
new
 IOException(strReply.Substring(
4
));
   }   
//
获得结果
   strMsg 
= 
""
;
   
while
(
true
)
   {
    
int
 iBytes 
=
 socketData.Receive(buffer, buffer.Length, 
0
);
    strMsg 
+=
 ASCII.GetString(buffer, 
0
, iBytes);
    
if
(iBytes 
<
 buffer.Length)
    {
     
break
;
    }
   }
   
char
[] seperator 
=
 {
'
\n
'
};
   
string
[] strsFileList 
=
 strMsg.Split(seperator);
   socketData.Close();
//
数据socket关闭时也会有返回码
   
if
(iReplyCode 
!= 
226
)
   {
    ReadReply();
    
if
(iReplyCode 
!= 
226
)
    {
     
throw 
new
 IOException(strReply.Substring(
4
));
    }
   }
   
return
 strsFileList;
}
      
/// 
<summary>
///
 获取文件大小
/// 
</summary>
/// 
<param name="strFileName">
文件名
</param>
/// 
<returns>
文件大小
</returns>
private 
long
 GetFileSize(
string
 strFileName)
{
   
if
(
!
bConnected)
   {
    Connect();
   }
   SendCommand(
"
SIZE 
" 
+
 Path.GetFileName(strFileName));
   
long
 lSize
=
0
;
   
if
(iReplyCode 
== 
213
)
   {
    lSize 
=
 Int64.Parse(strReply.Substring(
4
));
   }
   
else
   {
    
throw 
new
 IOException(strReply.Substring(
4
));
   }
   
return
 lSize;
}
/// 
<summary>
///
 删除
/// 
</summary>
/// 
<param name="strFileName">
待删除文件名
</param>
public 
void
 Delete(
string
 strFileName)
{
   
if
(
!
bConnected)
   {
    Connect();
   }
   SendCommand(
"
DELE 
"
+
strFileName);
   
if
(iReplyCode 
!= 
250
)
   {
    
throw 
new
 IOException(strReply.Substring(
4
));
   }
}
      
/// 
<summary>
///
 重命名(如果新文件名与已有文件重名,将覆盖已有文件)
/// 
</summary>
/// 
<param name="strOldFileName">
旧文件名
</param>
/// 
<param name="strNewFileName">
新文件名
</param>
public 
void
 Rename(
string
 strOldFileName,
string
 strNewFileName)
{
   
if
(
!
bConnected)
   {
    Connect();
   }
   SendCommand(
"
RNFR 
"
+
strOldFileName);
   
if
(iReplyCode 
!= 
350
)
   {
    
throw 
new
 IOException(strReply.Substring(
4
));
   }
   
//
 如果新文件名与原有文件重名,将覆盖原有文件
   SendCommand(
"
RNTO 
"
+
strNewFileName);
   
if
(iReplyCode 
!= 
250
)
   {
    
throw 
new
 IOException(strReply.Substring(
4
));
   }
}
#endregion 
    
#region
 上传和下载
/// 
<summary>
///
 下载一批文件
/// 
</summary>
/// 
<param name="strFileNameMask">
文件名的匹配字符串
</param>
/// 
<param name="strFolder">
本地目录(不得以\结束)
</param>
public 
void
 Get(
string
 strFileNameMask,
string
 strFolder)
{
   
if
(
!
bConnected)
   {
    Connect();
   }
   
string
[] strFiles 
=
 Dir(strFileNameMask);
   
foreach
(
string
 strFile 
in
 strFiles)
   {
    
if
(
!
strFile.Equals(
""
))
//
一般来说strFiles的最后一个元素可能是空字符串
    {
     Get(strFile,strFolder,strFile);
    }
   }
}
      
/// 
<summary>
///
 下载一个文件
/// 
</summary>
/// 
<param name="strRemoteFileName">
要下载的文件名
</param>
/// 
<param name="strFolder">
本地目录(不得以\结束)
</param>
/// 
<param name="strLocalFileName">
保存在本地时的文件名
</param>
public 
void
 Get(
string
 strRemoteFileName,
string
 strFolder,
string
 strLocalFileName)
{
   
if
(
!
bConnected)
   {
    Connect();
   }
   SetTransferType(TransferType.Binary);
   
if
 (strLocalFileName.Equals(
""
))
   {
    strLocalFileName 
=
 strRemoteFileName;
   }
   
if
(
!
File.Exists(strLocalFileName))
   {
    Stream st 
=
 File.Create(strLocalFileName);
    st.Close();
   }
   FileStream output 
= 
new
 
    FileStream(strFolder 
+ 
"
\\
" 
+
 strLocalFileName,FileMode.Create);
   Socket socketData 
=
 CreateDataSocket();
   SendCommand(
"
RETR 
" 
+
 strRemoteFileName);
   
if
(
!
(iReplyCode 
== 
150 
||
 iReplyCode 
== 
125
    
||
 iReplyCode 
== 
226 
||
 iReplyCode 
== 
250
))
   {
    
throw 
new
 IOException(strReply.Substring(
4
));
   }
   
while
(
true
)
   {
    
int
 iBytes 
=
 socketData.Receive(buffer, buffer.Length, 
0
);
    output.Write(buffer,
0
,iBytes);
    
if
(iBytes 
<= 
0
)
    {
     
break
;
    }
   }
   output.Close();
   
if
 (socketData.Connected)
   {
    socketData.Close();
   }
   
if
(
!
(iReplyCode 
== 
226 
||
 iReplyCode 
== 
250
))
   {
    ReadReply();
    
if
(
!
(iReplyCode 
== 
226 
||
 iReplyCode 
== 
250
))
    {
     
throw 
new
 IOException(strReply.Substring(
4
));
    }
   }
}
      
/// 
<summary>
///
 上传一批文件
/// 
</summary>
/// 
<param name="strFolder">
本地目录(不得以\结束)
</param>
/// 
<param name="strFileNameMask">
文件名匹配字符(可以包含*和?)
</param>
public 
void
 Put(
string
 strFolder,
string
 strFileNameMask)
{
   
string
[] strFiles 
=
 Directory.GetFiles(strFolder,strFileNameMask);
   
foreach
(
string
 strFile 
in
 strFiles)
   {
    
//
strFile是完整的文件名(包含路径)
    Put(strFile);
   }
}
      
/// 
<summary>
///
 上传一个文件
/// 
</summary>
/// 
<param name="strFileName">
本地文件名
</param>
public 
void
 Put(
string
 strFileName)
{
   
if
(
!
bConnected)
   {
    Connect();
   }
   Socket socketData 
=
 CreateDataSocket();
   SendCommand(
"
STOR 
"
+
Path.GetFileName(strFileName));
   
if
!
(iReplyCode 
== 
125 
||
 iReplyCode 
== 
150
) )
   {
    
throw 
new
 IOException(strReply.Substring(
4
));
   }
   FileStream input 
= 
new
 
    FileStream(strFileName,FileMode.Open);
   
int
 iBytes 
= 
0
;
   
while
 ((iBytes 
=
 input.Read(buffer,
0
,buffer.Length)) 
> 
0
)
   {
    socketData.Send(buffer, iBytes, 
0
);
   }
   input.Close();
   
if
 (socketData.Connected)
   {
    socketData.Close();
   }
   
if
(
!
(iReplyCode 
== 
226 
||
 iReplyCode 
== 
250
))
   {
    ReadReply();
    
if
(
!
(iReplyCode 
== 
226 
||
 iReplyCode 
== 
250
))
    {
     
throw 
new
 IOException(strReply.Substring(
4
));
    }
   }
}
    
#endregion 
    
#region
 目录操作
/// 
<summary>
///
 创建目录
/// 
</summary>
/// 
<param name="strDirName">
目录名
</param>
public 
void
 MkDir(
string
 strDirName)
{
   
if
(
!
bConnected)
   {
    Connect();
   }
   SendCommand(
"
MKD 
"
+
strDirName);
   
if
(iReplyCode 
!= 
257
)
   {
    
throw 
new
 IOException(strReply.Substring(
4
));
   }
}
    
/// 
<summary>
///
 删除目录
/// 
</summary>
/// 
<param name="strDirName">
目录名
</param>
public 
void
 RmDir(
string
 strDirName)
{
   
if
(
!
bConnected)
   {
    Connect();
   }
   SendCommand(
"
RMD 
"
+
strDirName);
   
if
(iReplyCode 
!= 
250
)
   {
    
throw 
new
 IOException(strReply.Substring(
4
));
   }
}
    
/// 
<summary>
///
 改变目录
/// 
</summary>
/// 
<param name="strDirName">
新的工作目录名
</param>
public 
void
 ChDir(
string
 strDirName)
{
   
if
(strDirName.Equals(
"
.
"
||
 strDirName.Equals(
""
))
   {
    
return
;
   }
   
if
(
!
bConnected)
   {
    Connect();
   }
   SendCommand(
"
CWD 
"
+
strDirName);
   
if
(iReplyCode 
!= 
250
)
   {
    
throw 
new
 IOException(strReply.Substring(
4
));
   }
   
this
.strRemotePath 
=
 strDirName;
}
    
#endregion 
    
#region
 内部变量
/// 
<summary>
///
 服务器返回的应答信息(包含应答码)
/// 
</summary>
private 
string
 strMsg;
/// 
<summary>
///
 服务器返回的应答信息(包含应答码)
/// 
</summary>
private 
string
 strReply;
/// 
<summary>
///
 服务器返回的应答码
/// 
</summary>
private 
int
 iReplyCode;
/// 
<summary>
///
 进行控制连接的socket
/// 
</summary>
private
 Socket socketControl;
/// 
<summary>
///
 传输模式
/// 
</summary>
private
 TransferType trType;
/// 
<summary>
///
 接收和发送数据的缓冲区
/// 
</summary>
private 
static 
int
 BLOCK_SIZE 
= 
512
;
Byte[] buffer 
= 
new
 Byte[BLOCK_SIZE];
/// 
<summary>
///
 编码方式
/// 
</summary>
Encoding ASCII 
=
 Encoding.ASCII;
#endregion 
    
#region
 内部函数
/// 
<summary>
///
 将一行应答字符串记录在strReply和strMsg
///
 应答码记录在iReplyCode
/// 
</summary>
private 
void
 ReadReply()
{
   strMsg 
= 
""
;
   strReply 
=
 ReadLine();
   iReplyCode 
=
 Int32.Parse(strReply.Substring(
0
,
3
));
/// 
<summary>
///
 建立进行数据连接的socket
/// 
</summary>
/// 
<returns>
数据连接socket
</returns>
private
 Socket CreateDataSocket()
{
   SendCommand(
"
PASV
"
);
   
if
(iReplyCode 
!= 
227
)
   {
    
throw 
new
 IOException(strReply.Substring(
4
));
   }
   
int
 index1 
=
 strReply.IndexOf(
'
(
'
);
   
int
 index2 
=
 strReply.IndexOf(
'
)
'
);
   
string
 ipData 
=
 
    strReply.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 strReply: 
" 
+
 
      strReply);
    }
    
if
 (ch 
== 
'
,
' 
||
 i
+
1 
==
 len)
    {
     
try
     {
      parts[partCount
++
=
 Int32.Parse(buf);
      buf
=
""
;
     }
     
catch
 (Exception)
     {
      
throw 
new
 IOException(
"
Malformed PASV strReply: 
" 
+
 
       strReply);
     }
    }
   }
   
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);
   IPEndPoint ep 
= 
new
 
    IPEndPoint(IPAddress.Parse(ipAddress), port);
   
try
   {
    s.Connect(ep);
   }
   
catch
(Exception)
   {
    
throw 
new
 IOException(
"
Can't connect to remote server
"
);
   }
   
return
 s;
}
/// 
<summary>
///
 关闭socket连接(用于登录以前)
/// 
</summary>
private 
void
 CloseSocketConnect()
{
   
if
(socketControl
!=
null
)
   {
    socketControl.Close();
    socketControl 
= 
null
;
   }
   bConnected 
= 
false
;
}
/// 
<summary>
///
 读取Socket返回的所有字符串
/// 
</summary>
/// 
<returns>
包含应答码的字符串行
</returns>
private 
string
 ReadLine()
{
   
while
(
true
)
   {
    
int
 iBytes 
=
 socketControl.Receive(buffer, buffer.Length, 
0
);
    strMsg 
+=
 ASCII.GetString(buffer, 
0
, iBytes);
    
if
(iBytes 
<
 buffer.Length)
    {
     
break
;
    }
   }
   
char
[] seperator 
=
 {
'
\n
'
};
   
string
[] mess 
=
 strMsg.Split(seperator);
   
if
(strMsg.Length 
> 
2
)
   {
    strMsg 
=
 mess[mess.Length
-
2
];
    
//
seperator[0]是10,换行符是由13和0组成的,分隔后10后面虽没有字符串,
    
//
但也会分配为空字符串给后面(也是最后一个)字符串数组,
    
//
所以最后一个mess是没用的空字符串
    
//
但为什么不直接取mess[0],因为只有最后一行字符串应答码与信息之间有空格
   }
   
else
   {
    strMsg 
=
 mess[
0
];
   }
   
if
(
!
strMsg.Substring(
3
,
1
).Equals(
" 
"
))
//
返回字符串正确的是以应答码(如220开头,后面接一空格,再接问候字符串)
   {
    
return
 ReadLine();
   }
   
return
 strMsg;
}
/// 
<summary>
///
 发送命令并获取应答码和最后一行应答字符串
/// 
</summary>
/// 
<param name="strCommand">
命令
</param>
private 
void
 SendCommand(String strCommand)
{
            
//
Byte[] cmdBytes =
            
//
 Encoding.ASCII.GetBytes((strCommand + "\r\n").ToCharArray());
            
byte
[] cmdBytes 
=
 Encoding.GetEncoding(
"
gb2312
"
).GetBytes((strCommand 
+ 
"
\r\n
"
).ToCharArray());
            socketControl.Send(cmdBytes, cmdBytes.Length, 
0
);
            ReadReply();
    
#endregion 
}
url:
.net 2.0(c#)下简单的FTP应用程序
原文地址:


原文发布日期:2007.01.18

作者:

翻译:


本文使用.net 2.0(c#)来实现一般的FTP功能


介绍

微软的.net framework 2.0相对于1.x来说增加了对FTP的支持。以前为了符合我的需求,我不等不使用第三方类库来实现FTP功能,但是为了可靠,还是使用.net framework的类比较好。我的这段代码没有做成可重复使用的类库的形式,但它却是比较容易理解的并能满足你的需求。它可以实现上传,下载,删除等任意功能。在这篇文章的后面将给大家出示.net 2.0下实现ftp的简单代码,使用的语言是c#。或许是因为这是.net新增的类,又或许是第三方类库已经能很好的实现你的需求,.net 2.0的这部分类库并没有得到足够的关注。


背景

作为我的工作的一部分,我已经使用了ftp模块,但是我只能在.net 1.1中去使用它,所以我不能深入的研究.net 2.0下ftp的实现。但是我相信,.ne 2.0下对ftp的支持是非常好的。


代码

不要忘记引入命名空间

using System.Net;
using System.IO;

下面的几个步骤包括了使用FtpWebRequest类实现ftp功能的一般过程


1、创建一个FtpWebRequest对象,指向ftp服务器的uri

2、设置ftp的执行方法(上传,下载等)

3、给FtpWebRequest对象设置属性(是否支持ssl,是否使用二进制传输等)

4、设置登录验证(用户名,密码)

5、执行请求

6、接收相应流(如果需要的话)

7、如果没有打开的流,则关闭ftp请求


开发任何ftp应用程序都需要一个相关的ftp服务器及它的配置信息。FtpWebRequest暴露了一些属性来设置这些信息。


接下来的代码示例了上传功能


首先设置一个uri地址,包括路径和文件名。这个uri被使用在FtpWebRequest实例中。


然后根据ftp请求设置FtpWebRequest对象的属性


其中一些重要的属性如下:

    ·Credentials - 指定登录ftp服务器的用户名和密码。

    ·KeepAlive - 指定连接是应该关闭还是在请求完成之后关闭,默认为true

    ·UseBinary - 指定文件传输的类型。有两种文件传输模式,一种是Binary,另一种是ASCII。两种方法在传输时,字节的第8位是不同的。ASCII使用第8位作为错误控制,而Binary的8位都是有意义的。所以当你使用ASCII传输时要小心一些。简单的说,如果能用记事本读和写的文件用ASCII传输就是安全的,而其他的则必须使用Binary模式。当然使用Binary模式发送ASCII文件也是非常好的。

    ·UsePassive - 指定使用主动模式还是被动模式。早先所有客户端都使用主动模式,而且工作的很好,而现在因为客户端防火墙的存在,将会关闭一些端口,这样主动模式将会失败。在这种情况下就要使用被动模式,但是一些端口也可能被服务器的防火墙封掉。不过因为ftp服务器需要它的ftp服务连接到一定数量的客户端,所以他们总是支持被动模式的。这就是我们为什么要使用被动模式的原意,为了确保数据可以正确的传输,使用被动模式要明显优于主动模式。(译者注:主动(PORT)模式建立数据传输通道是由服务器端发起的,服务器使用20端口连接客户端的某一个大于1024的端口;在被动(PASV)模式中,数据传输的通道的建立是由FTP客户端发起的,他使用一个大于1024的端口连接服务器的1024以上的某一个端口)

    ·ContentLength - 设置这个属性对于ftp服务器是有用的,但是客户端不使用它,因为FtpWebRequest忽略这个属性,所以在这种情况下,该属性是无效的。但是如果我们设置了这个属性,ftp服务器将会提前预知文件的大小(在upload时会有这种情况)

    ·Method - 指定当前请求是什么命令(upload,download,filelist等)。这个值定义在结构体WebRequestMethods.Ftp中。


private 
void Upload(
string filename)
{
    FileInfo fileInf = new FileInfo(filename);
    string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
    FtpWebRequest reqFTP; 
    // 根据uri创建FtpWebRequest对象 
    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileInf.Name)); 
    // ftp用户名和密码
    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
    // 默认为true,连接不会被关闭
    
// 在一个命令之后被执行
    reqFTP.KeepAlive = false
    // 指定执行什么命令
    reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 
    // 指定数据传输类型
    reqFTP.UseBinary = true
    // 上传文件时通知服务器文件的大小
    reqFTP.ContentLength = fileInf.Length; 
    // 缓冲大小设置为2kb
    int buffLength = 2048;
    byte[] buff = new byte[buffLength];
    int contentLen; 
    // 打开一个文件流 (System.IO.FileStream) 去读上传的文件
    FileStream fs = fileInf.OpenRead(); 
    try
    {
        // 把上传的文件写入流
        Stream strm = reqFTP.GetRequestStream(); 
        // 每次读文件流的2kb
        contentLen = fs.Read(buff, 0, buffLength); 
        // 流内容没有结束
        while (contentLen != 0)
        {
            // 把内容从file stream 写入 upload stream
            strm.Write(buff, 0, contentLen);
            contentLen = fs.Read(buff, 0, buffLength);
        }
 
        // 关闭两个流
        strm.Close();
        fs.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Upload Error");
    }
}

以上代码简单的示例了ftp的上传功能。创建一个指向某ftp服务器的FtpWebRequest对象,然后设置其不同的属性Credentials,KeepAlive,Method,UseBinary,ContentLength。


打开本地机器上的文件,把其内容写入ftp请求流。缓冲的大小为2kb,无论上传大文件还是小文件,这都是一个合适的大小。


private 
void Download(
string filePath, 
string fileName)
{
    FtpWebRequest reqFTP;
    try
    {
        FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create); 
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileName));
        reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
        reqFTP.UseBinary = true;
        reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
        FtpWebResponse response = (FtpWebResponse)reqFTP.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();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

上面的代码实现了从ftp服务器上下载文件的功能。这不同于之前所提到的上传功能,下载需要一个响应流,它包含着下载文件的内容。这个下载的文件是在FtpWebRequest对象中的uri指定的。在得到所请求的文件后,通过FtpWebRequest对象的GetResponse()方法下载文件。它将把文件作为一个流下载到你的客户端的机器上。


注意:我们可以设置文件在我们本地机器上的存放路径和名称。


public 
string[] GetFileList()
{    
    string[] downloadFiles;    
    StringBuilder result = new StringBuilder();    
    FtpWebRequest reqFTP;    
    try    
    {        
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/"));        
        reqFTP.UseBinary = true;        
        reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);        
        reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;        
        WebResponse response = reqFTP.GetResponse();        
        StreamReader reader = new StreamReader(response.GetResponseStream());        
        string line = reader.ReadLine();        
        while (line != null)        
        {            
            result.Append(line);            
            result.Append("\n");            
            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)    
    {        
        System.Windows.Forms.MessageBox.Show(ex.Message);        
        downloadFiles = null;        
        return downloadFiles;    
    }
}

上面的代码示例了如何从ftp服务器上获得文件列表。uri指向ftp服务器的地址。我们使用StreamReader对象来存储一个流,文件名称列表通过“\r\n”分隔开,也就是说每一个文件名称都占一行。你可以使用StreamReader对象的ReadToEnd()方法来得到文件列表。上面的代码中我们用一个StringBuilder对象来保存文件名称,然后把结果通过分隔符分开后作为一个数组返回。我确定只是一个比较好的方法。


其他的实现如Rename,Delete,GetFileSize,FileListDetails,MakeDir等与上面的几段代码类似,就不多说了。


注意:实现重命名的功能时,要把新的名字设置给FtpWebRequest对象的RenameTo属性。连接指定目录的时候,需要在FtpWebRequest对象所使用的uri中指明。



需要注意的地方

你在编码时需要注意以下几点:

    ·除非EnableSsl属性被设置成true,否作所有数据,包括你的用户名和密码都将明文发给服务器,任何监视网络的人都可以获取到你连接服务器的验证信息。如果你连接的ftp服务器提供了SSL,你就应当把EnableSsl属性设置为true。

    ·如果你没有访问ftp服务器的权限,将会抛出SecurityException错误

    ·发送请求到ftp服务器需要调用GetResponse方法。当请求的操作完成后,一个FtpWebResponse对象将返回。这个FtpWebResponse对象提供了操作的状态和已经从ftp服务器上下载的数据。FtpWebResponse对象的StatusCode属性提供了ftp服务器返回的最后的状态代码。FtpWebResponse对象的StatusDescription属性为这个状态代码的描述。

转载于:https://www.cnblogs.com/greatverve/archive/2012/03/03/csharp-ftp.html

你可能感兴趣的文章
内存四区
查看>>
Melody Love Story
查看>>
centos7安装与配置ansible
查看>>
Istio Service Mesh中的授权与鉴权概念详解
查看>>
构建Class
查看>>
ESXI5 中添加共享存储,安装Oracle Rac
查看>>
动态规划之背包问题
查看>>
ASP.NET中的{0:g}
查看>>
L2TP工作过程
查看>>
hbase伪集群搭建
查看>>
Properties
查看>>
parasoft Jtest 使用教程:修改规则与运行简单的用户自定义测试配置
查看>>
使用RPM包离线安装MariaDB 10.0.20 , 基于CentOS 6.6-x86-64
查看>>
MySQL Study之--Index的强制使用和忽略
查看>>
very good
查看>>
手机web——自适应网页设计(html/css控制)
查看>>
VS2010编译错:WIN32_WINNT to be #defined at least to 0x0403...的解决方法
查看>>
Java泛型编程 - 边界
查看>>
个人消费记录软件
查看>>
Java之LinkedList源码浅析
查看>>