FTP的完整類<2><轉>
#region 上傳檔案
///
/// 上傳檔案到FTP伺服器
///
/// 本地帶有完整路徑的檔名
public bool UploadFile(string LocalFullPath)
{
return UploadFile(LocalFullPath, Path.GetFileName(LocalFullPath), false);
}
///
/// 上傳檔案到FTP伺服器
///
/// 本地帶有完整路徑的檔案
/// 是否覆蓋遠端伺服器上面同名的檔案
public bool UploadFile(string LocalFullPath, bool OverWriteRemoteFile)
{
return UploadFile(LocalFullPath, Path.GetFileName(LocalFullPath), OverWriteRemoteFile);
}
///
/// 上傳檔案到FTP伺服器
///
/// 本地帶有完整路徑的檔案
/// 要在FTP伺服器上面儲存檔名
public bool UploadFile(string LocalFullPath, string RemoteFileName)
{
return UploadFile(LocalFullPath, RemoteFileName, false);
}
///
/// 上傳檔案到FTP伺服器
///
/// 本地帶有完整路徑的檔名
/// 要在FTP伺服器上面儲存檔名
/// 是否覆蓋遠端伺服器上面同名的檔案
public bool UploadFile(string LocalFullPath, string RemoteFileName, bool OverWriteRemoteFile)
{
try
{
if (!IsValidFileChars(RemoteFileName) || !IsValidFileChars(Path.GetFileName(LocalFullPath)) || !IsValidPathChars(Path.GetDirectoryName(LocalFullPath)))
{
throw new Exception("非法檔名或目錄名!");
}
if (File.Exists(LocalFullPath))
{
FileStream Stream = new FileStream(LocalFullPath, FileMode.Open, FileAccess.Read);
byte[] bt = new byte[Stream.Length];
Stream.Read(bt, 0, (Int32)Stream.Length); //注意,因為Int32的最大限制,最大上傳檔案只能是大約2G多一點
Stream.Close();
return UploadFile(bt, RemoteFileName, OverWriteRemoteFile);
}
else
{
throw new Exception("本地檔案不存在!");
}
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
///
/// 上傳檔案到FTP伺服器
///
/// 上傳的二進位制資料
/// 要在FTP伺服器上面儲存檔名
public bool UploadFile(byte[] FileBytes, string RemoteFileName)
{
if (!IsValidFileChars(RemoteFileName))
{
throw new Exception("非法檔名或目錄名!");
}
return UploadFile(FileBytes, RemoteFileName, false);
}
///
/// 上傳檔案到FTP伺服器
///
/// 檔案二進位制內容
/// 要在FTP伺服器上面儲存檔名
/// 是否覆蓋遠端伺服器上面同名的檔案
public bool UploadFile(byte[] FileBytes, string RemoteFileName, bool OverWriteRemoteFile)
{
try
{
if (!IsValidFileChars(RemoteFileName))
{
throw new Exception("非法檔名!");
}
if (!OverWriteRemoteFile && FileExist(RemoteFileName))
{
throw new Exception("FTP服務上面已經存在同名檔案!");
}
Response = Open(new Uri(this.Uri.ToString() + RemoteFileName), WebRequestMethods.Ftp.UploadFile);
Stream requestStream = Request.GetRequestStream();
MemoryStream mem = new MemoryStream(FileBytes);
byte[] buffer = new byte[1024];
int bytesRead = 0;
int TotalRead = 0;
while (true)
{
bytesRead = mem.Read(buffer, 0, buffer.Length);
if (bytesRead == 0)
break;
TotalRead += bytesRead;
requestStream.Write(buffer, 0, bytesRead);
}
requestStream.Close();
Response = (FtpWebResponse)Request.GetResponse();
mem.Close();
mem.Dispose();
FileBytes = null;
return true;
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
#endregion
#region 非同步上傳檔案
///
/// 非同步上傳檔案到FTP伺服器
///
/// 本地帶有完整路徑的檔名
public void UploadFileAsync(string LocalFullPath)
{
UploadFileAsync(LocalFullPath, Path.GetFileName(LocalFullPath), false);
}
///
/// 非同步上傳檔案到FTP伺服器
///
/// 本地帶有完整路徑的檔案
/// 是否覆蓋遠端伺服器上面同名的檔案
public void UploadFileAsync(string LocalFullPath, bool OverWriteRemoteFile)
{
UploadFileAsync(LocalFullPath, Path.GetFileName(LocalFullPath), OverWriteRemoteFile);
}
///
/// 非同步上傳檔案到FTP伺服器
///
/// 本地帶有完整路徑的檔案
/// 要在FTP伺服器上面儲存檔名
public void UploadFileAsync(string LocalFullPath, string RemoteFileName)
{
UploadFileAsync(LocalFullPath, RemoteFileName, false);
}
///
/// 非同步上傳檔案到FTP伺服器
///
/// 本地帶有完整路徑的檔名
/// 要在FTP伺服器上面儲存檔名
/// 是否覆蓋遠端伺服器上面同名的檔案
public void UploadFileAsync(string LocalFullPath, string RemoteFileName, bool OverWriteRemoteFile)
{
try
{
if (!IsValidFileChars(RemoteFileName) || !IsValidFileChars(Path.GetFileName(LocalFullPath)) || !IsValidPathChars(Path.GetDirectoryName(LocalFullPath)))
{
throw new Exception("非法檔名或目錄名!");
}
if (!OverWriteRemoteFile && FileExist(RemoteFileName))
{
throw new Exception("FTP服務上面已經存在同名檔案!");
}
if (File.Exists(LocalFullPath))
{
MyWebClient client = new MyWebClient();
client.UploadProgressChanged += new UploadProgressChangedEventHandler(client_UploadProgressChanged);
client.UploadFileCompleted += new UploadFileCompletedEventHandler(client_UploadFileCompleted);
client.Credentials = new NetworkCredential(this.UserName, this.Password);
if (this.Proxy != null)
{
client.Proxy = this.Proxy;
}
client.UploadFileAsync(new Uri(this.Uri.ToString() + RemoteFileName), LocalFullPath);
}
else
{
throw new Exception("本地檔案不存在!");
}
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
///
/// 非同步上傳檔案到FTP伺服器
///
/// 上傳的二進位制資料
/// 要在FTP伺服器上面儲存檔名
public void UploadFileAsync(byte[] FileBytes, string RemoteFileName)
{
if (!IsValidFileChars(RemoteFileName))
{
throw new Exception("非法檔名或目錄名!");
}
UploadFileAsync(FileBytes, RemoteFileName, false);
}
///
/// 非同步上傳檔案到FTP伺服器
///
/// 檔案二進位制內容
/// 要在FTP伺服器上面儲存檔名
/// 是否覆蓋遠端伺服器上面同名的檔案
public void UploadFileAsync(byte[] FileBytes, string RemoteFileName, bool OverWriteRemoteFile)
{
try
{
if (!IsValidFileChars(RemoteFileName))
{
throw new Exception("非法檔名!");
}
if (!OverWriteRemoteFile && FileExist(RemoteFileName))
{
throw new Exception("FTP服務上面已經存在同名檔案!");
}
string TempPath = System.Environment.GetFolderPath(Environment.SpecialFolder.Templates);
if (!TempPath.EndsWith("\\"))
{
TempPath += "\\";
}
string TempFile = TempPath + Path.GetRandomFileName();
TempFile = Path.ChangeExtension(TempFile, Path.GetExtension(RemoteFileName));
FileStream Stream = new FileStream(TempFile, FileMode.CreateNew, FileAccess.Write);
Stream.Write(FileBytes, 0, FileBytes.Length); //注意,因為Int32的最大限制,最大上傳檔案只能是大約2G多一點
Stream.Flush();
Stream.Close();
Stream.Dispose();
_isDeleteTempFile = true;
_UploadTempFile = TempFile;
FileBytes = null;
UploadFileAsync(TempFile, RemoteFileName, OverWriteRemoteFile);
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
///
/// 非同步上傳檔案完成之後觸發的事件
///
/// 下載物件
/// 資料資訊物件
void client_UploadFileCompleted(object sender, UploadFileCompletedEventArgs e)
{
if (_isDeleteTempFile)
{
if (File.Exists(_UploadTempFile))
{
File.SetAttributes(_UploadTempFile, FileAttributes.Normal);
File.Delete(_UploadTempFile);
}
_isDeleteTempFile = false;
}
if (UploadFileCompleted != null)
{
UploadFileCompleted(sender, e);
}
}
///
/// 非同步上傳進度發生改變觸發的事件
///
/// 下載物件
/// 進度資訊物件
void client_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
{
if (UploadProgressChanged != null)
{
UploadProgressChanged(sender, e);
}
}
#endregion
#region 列出目錄檔案資訊
///
/// 列出FTP伺服器上面當前目錄的所有檔案和目錄
///
public FileStruct[] ListFilesAndDirectories()
{
Response = Open(this.Uri, WebRequestMethods.Ftp.ListDirectoryDetails);
StreamReader stream = new StreamReader(Response.GetResponseStream(), Encoding.Default);
string Datastring = stream.ReadToEnd();
FileStruct[] list = GetList(Datastring);
return list;
}
///
/// 列出FTP伺服器上面當前目錄的所有檔案
///
public FileStruct[] ListFiles()
{
FileStruct[] listAll = ListFilesAndDirectories();
List
foreach (FileStruct file in listAll)
{
if (!file.IsDirectory)
{
listFile.Add(file);
}
}
return listFile.ToArray();
}
///
/// 列出FTP伺服器上面當前目錄的所有的目錄
///
public FileStruct[] ListDirectories()
{
FileStruct[] listAll = ListFilesAndDirectories();
List
foreach (FileStruct file in listAll)
{
if (file.IsDirectory)
{
listDirectory.Add(file);
}
}
return listDirectory.ToArray();
}
///
/// 獲得檔案和目錄列表
///
/// FTP返回的列表字元資訊
private FileStruct[] GetList(string datastring)
{
List
string[] dataRecords = datastring.Split('\n');
FileListStyle. _directoryListStyle. = GuessFileListStyle(dataRecords);
foreach (string s in dataRecords)
{
if (_directoryListStyle. != FileListStyle.Unknown && s != "")
{
FileStruct f = new FileStruct();
f.Name = "..";
switch (_directoryListStyle)
{
case FileListStyle.UnixStyle.:
f = ParseFileStructFromUnixStyleRecord(s);
break;
case FileListStyle.WindowsStyle.:
f = ParseFileStructFromWindowsStyleRecord(s);
break;
}
if (!(f.Name == "." || f.Name == ".."))
{
myListArray.Add(f);
}
}
}
return myListArray.ToArray();
}
///
/// 從Windows格式中返回檔案資訊
///
/// 檔案資訊
private FileStruct ParseFileStructFromWindowsStyleRecord(string Record)
{
FileStruct f = new FileStruct();
string processstr = Record.Trim();
string dateStr = processstr.Substring(0, 8);
processstr = (processstr.Substring(8, processstr.Length - 8)).Trim();
string timeStr = processstr.Substring(0, 7);
processstr = (processstr.Substring(7, processstr.Length - 7)).Trim();
DateTimeFormatInfo myDTFI = new CultureInfo("en-US", false).DateTimeFormat;
myDTFI.ShortTimePattern = "t";
f.CreateTime = DateTime.Parse(dateStr + " " + timeStr, myDTFI);
if (processstr.Substring(0, 5) == "
{
f.IsDirectory = true;
processstr = (processstr.Substring(5, processstr.Length - 5)).Trim();
}
else
{
string[] strs = processstr.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); // true);
processstr = strs[1];
f.IsDirectory = false;
}
f.Name = processstr;
return f;
}
///
/// 判斷檔案列表的方式Window方式還是Unix方式
///
/// 檔案資訊列表
private FileListStyle. GuessFileListStyle(string[] recordList)
{
foreach (string s in recordList)
{
if (s.Length > 10
&& Regex.IsMatch(s.Substring(0, 10), "(-|d)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)"))
{
return FileListStyle.UnixStyle;
}
else if (s.Length > 8
&& Regex.IsMatch(s.Substring(0, 8), "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"))
{
return FileListStyle.WindowsStyle;
}
}
return FileListStyle.Unknown;
}
///
/// 從Unix格式中返回檔案資訊
///
/// 檔案資訊
private FileStruct ParseFileStructFromUnixStyleRecord(string Record)
{
FileStruct f = new FileStruct();
string processstr = Record.Trim();
f.Flags = processstr.Substring(0, 10);
f.IsDirectory = (f.Flags[0] == 'd');
processstr = (processstr.Substring(11)).Trim();
_cutSubstringFromStringWithTrim(ref processstr, ' ', 0); //跳過一部分
f.Owner = _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);
f.Group = _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);
_cutSubstringFromStringWithTrim(ref processstr, ' ', 0); //跳過一部分
string yearOrTime = processstr.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[2];
if (yearOrTime.IndexOf(":") >= 0) //time
{
processstr = processstr.Replace(yearOrTime, DateTime.Now.Year.ToString());
}
f.CreateTime = DateTime.Parse(_cutSubstringFromStringWithTrim(ref processstr, ' ', 8));
f.Name = processstr; //最後就是名稱
return f;
}
///
/// 按照一定的規則進行字串擷取
///
/// 擷取的字串
/// 查詢的字元
/// 查詢的位置
private string _cutSubstringFromStringWithTrim(ref string s, char c, int startIndex)
{
int pos1 = s.IndexOf(c, startIndex);
string retString = s.Substring(0, pos1);
s = (s.Substring(pos1)).Trim();
return retString;
}
#endregion
#region 目錄或檔案存在的判斷
///
/// 判斷當前目錄下指定的子目錄是否存在
///
/// 指定的目錄名
public bool DirectoryExist(string RemoteDirectoryName)
{
try
{
if (!IsValidPathChars(RemoteDirectoryName))
{
throw new Exception("目錄名非法!");
}
FileStruct[] listDir = ListDirectories();
foreach (FileStruct dir in listDir)
{
if (dir.Name == RemoteDirectoryName)
{
return true;
}
}
return false;
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
///
/// 判斷一個遠端檔案是否存在伺服器當前目錄下面
///
/// 遠端檔名
public bool FileExist(string RemoteFileName)
{
try
{
if (!IsValidFileChars(RemoteFileName))
{
throw new Exception("檔名非法!");
}
FileStruct[] listFile = ListFiles();
foreach (FileStruct file in listFile)
{
if (file.Name == RemoteFileName)
{
return true;
}
}
return false;
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
#endregion
#region 刪除檔案
///
/// 從FTP伺服器上面刪除一個檔案
///
/// 遠端檔名
public void DeleteFile(string RemoteFileName)
{
try
{
if (!IsValidFileChars(RemoteFileName))
{
throw new Exception("檔名非法!");
}
Response = Open(new Uri(this.Uri.ToString() + RemoteFileName), WebRequestMethods.Ftp.DeleteFile);
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
#endregion
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22392018/viewspace-712399/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- FTP工具類FTP
- java ftp工具類,帶你領略5款不同的java ftp工具類JavaFTP
- 推薦一個java操作ftp的工具類JavaFTP
- Win10開啟FTP與配置(完整無錯版)Win10FTP
- 一個完整的COM通訊類
- FTP主動模式和被動模式(2)- 防火牆對FTP的影響 ASPFFTP模式防火牆
- 北大FTP,除了北大FTP其他好用的FTP軟體FTP
- 類轉json的基類實現JSON
- 非完整資料聚類初探聚類
- FTP,FTP連線的辦法,配置方式FTP
- String類的使用2
- 【轉】Object類的常用方法Object
- HackTools————2.簡單FTP網路掃描FTP
- 免費的FTP工具,免費的FTP工具下載!FTP
- FTP伺服器搭建踩坑和工具類實現FTP伺服器
- ftp的passive模式FTP模式
- ftp工具,6款好用的ftp工具,來自運維人員好用的ftp工具推薦。FTP運維
- 使用commons-pool2實現FTP連線池FTP
- 常用的Java類方法【轉載】Java
- 理解數字化轉型:3個階段、2個分類和3類價值
- 簡單實用的FTP客戶端:Viper FTP for MacFTP客戶端Mac
- ftp,ftp是幹什麼的,怎麼運用呢?FTP
- 從 "垃圾 "資料到資料完整性的轉變
- PHP外掛系統的實現(六):完整經理類PHP
- FTP的配置和管理FTP
- 分類2
- 公司類別(轉)
- 簡單好用的ftp檔案傳輸工具:Viper FTP for MacFTPMac
- 實用的FTP客戶端:FTP Disk for Mac中文版FTP客戶端Mac
- 進位制轉換的工具類
- ftp,安全ftp軟體哪個好FTP
- 尤拉計劃658:不完整的單詞(2)
- 國內好用的ftp軟體,三款國內好用的ftp軟體FTP
- centos ftpCentOSFTP
- FTP的安裝和使用FTP
- FTP 命令的使用詳解FTP
- centos7環境 nginx轉發ftp請求(親測可用)CentOSNginxFTP
- FTP客戶端工具Yummy FTP Pro MacFTP客戶端Mac
- wing ftp server(ftp伺服器軟體)FTPServer伺服器