using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Globalization;
using System.Text.RegularExpressions;
namespace System.Net.Ftp
{
///
/// FTP處理操作類
/// 功能:
/// 下載文件
/// 上傳文件
/// 上傳文件的進度信息
/// 下載文件的進度信息
/// 刪除文件
/// 列出文件
/// 列出目錄
/// 進入子目錄
/// 退出當前目錄返回上一層目錄
/// 判斷遠程文件是否存在
/// 判斷遠程文件是否存在
/// 刪除遠程文件
/// 建立目錄
/// 刪除目錄
/// 文件(目錄)改名
///
#region 文件信息結構
public struct FileStruct
{
public string Flags;
public string Owner;
public string Group;
public bool IsDirectory;
public DateTime CreateTime;
public string Name;
}
public enum FileListStyle
{
UnixStyle,
WindowsStyle,
Unknown
}
#endregion
public class clsFTP
{
#region 屬性信息
///
/// FTP請求對象
///
FtpWebRequest Request = null;
///
/// FTP響應對象
///
FtpWebResponse Response = null;
///
/// FTP服務器地址
///
private Uri _Uri;
///
/// FTP服務器地址
///
public Uri Uri
{
get
{
if (_DirectoryPath == "/")
{
return _Uri;
}
else
{
string strUri = _Uri.ToString();
if (strUri.EndsWith("/"))
{
strUri = strUri.Substring(0, strUri.Length - 1);
}
return new Uri(strUri + this.DirectoryPath);
}
}
set
{
if (value.Scheme != Uri.UriSchemeFtp)
{
throw new Exception("Ftp 地址格式錯誤!");
}
_Uri = new Uri(value.GetLeftPart(UriPartial.Authority));
_DirectoryPath = value.AbsolutePath;
if (!_DirectoryPath.EndsWith("/"))
{
_DirectoryPath += "/";
}
}
}
///
/// 當前工作目錄
///
private string _DirectoryPath;
///
/// 當前工作目錄
///
public string DirectoryPath
{
get { return _DirectoryPath; }
set { _DirectoryPath = value; }
}
///
/// FTP登錄用戶
///
private string _UserName;
///
/// FTP登錄用戶
///
public string UserName
{
get { return _UserName; }
set { _UserName = value; }
}
///
/// 錯誤信息
///
private string _ErrorMsg;
///
/// 錯誤信息
///
public string ErrorMsg
{
get { return _ErrorMsg; }
set { _ErrorMsg = value; }
}
///
/// FTP登錄密碼
///
private string _Password;
///
/// FTP登錄密碼
///
public string Password
{
get { return _Password; }
set { _Password = value; }
}
///
/// 連接FTP服務器的代理服務
///
private WebProxy _Proxy = null;
///
/// 連接FTP服務器的代理服務
///
public WebProxy Proxy
{
get
{
return _Proxy;
}
set
{
_Proxy = value;
}
}
///
/// 是否需要刪除臨時文件
///
private bool _isDeleteTempFile = false;
///
/// 異步上傳所臨時生成的文件
///
private string _UploadTempFile = "";
#endregion
#region 事件
public delegate void De_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e);
public delegate void De_DownloadDataCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e);
public delegate void De_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e);
public delegate void De_UploadFileCompleted(object sender, UploadFileCompletedEventArgs e);
///
/// 異步下載進度發生改變觸發的事件
///
public event De_DownloadProgressChanged DownloadProgressChanged;
///
/// 異步下載文件完成之後觸發的事件
///
public event De_DownloadDataCompleted DownloadDataCompleted;
///
/// 異步上傳進度發生改變觸發的事件
///
public event De_UploadProgressChanged UploadProgressChanged;
///
/// 異步上傳文件完成之後觸發的事件
///
public event De_UploadFileCompleted UploadFileCompleted;
#endregion
#region 構造析構函數
///
/// 構造函數
///
/// FTP地址
/// 登錄用戶名
/// 登錄密碼
public clsFTP(Uri FtpUri, string strUserName, string strPassword)
{
this._Uri = new Uri(FtpUri.GetLeftPart(UriPartial.Authority));
_DirectoryPath = FtpUri.AbsolutePath;
if (!_DirectoryPath.EndsWith("/"))
{
_DirectoryPath += "/";
}
this._UserName = strUserName;
this._Password = strPassword;
this._Proxy = null;
}
///
/// 構造函數
///
/// FTP地址
/// 登錄用戶名
/// 登錄密碼
/// 連接代理
public clsFTP(Uri FtpUri, string strUserName, string strPassword, WebProxy objProxy)
{
this._Uri = new Uri(FtpUri.GetLeftPart(UriPartial.Authority));
_DirectoryPath = FtpUri.AbsolutePath;
if (!_DirectoryPath.EndsWith("/"))
{
_DirectoryPath += "/";
}
this._UserName = strUserName;
this._Password = strPassword;
this._Proxy = objProxy;
}
///
/// 構造函數
///
public clsFTP()
{
this._UserName = "anonymous"; //匿名用戶
this._Password = "@anonymous";
this._Uri = null;
this._Proxy = null;
}
///
/// 析構函數
///
~clsFTP()
{
if (Response != null)
{
Response.Close();
Response = null;
}
if (Request != null)
{
Request.Abort();
Request = null;
}
}
#endregion
#region 建立連接
///
/// 建立FTP鏈接,返迴響應對象
///
/// FTP地址
/// 操作命令
private FtpWebResponse Open(Uri uri, string FtpMathod)
{
try
{
Request = (FtpWebRequest)WebRequest.Create(uri);
Request.Method = FtpMathod;
Request.UseBinary = true;
Request.Credentials = new NetworkCredential(this.UserName, this.Password);
if (this.Proxy != null)
{
Request.Proxy = this.Proxy;
}
return (FtpWebResponse)Request.GetResponse();
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
///
/// 建立FTP鏈接,返回請求對象
///
/// FTP地址
/// 操作命令
private FtpWebRequest OpenRequest(Uri uri, string FtpMathod)
{
try
{
Request = (FtpWebRequest)WebRequest.Create(uri);
Request.Method = FtpMathod;
Request.UseBinary = true;
Request.Credentials = new NetworkCredential(this.UserName, this.Password);
if (this.Proxy != null)
{
Request.Proxy = this.Proxy;
}
return Request;
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
#endregion
#region 下載文件
///
/// 從FTP服務器下載文件,使用與遠程文件同名的文件名來保存文件
///
/// 遠程文件名
/// 本地路徑
public bool DownloadFile(string RemoteFileName, string LocalPath)
{
return DownloadFile(RemoteFileName, LocalPath, RemoteFileName);
}
///
/// 從FTP服務器下載文件,指定本地路徑和本地文件名
///
/// 遠程文件名
/// 本地路徑
/// 保存文件的本地路徑,後面帶有"\"
/// 保存本地的文件名
public bool DownloadFile(string RemoteFileName, string LocalPath, string LocalFileName)
{
byte[] bt = null;
try
{
if (!IsValidFileChars(RemoteFileName) || !IsValidFileChars(LocalFileName) || !IsValidPathChars(LocalPath))
{
throw new Exception("非法文件名或目錄名!");
}
if (!Directory.Exists(LocalPath))
{
throw new Exception("本地文件路徑不存在!");
}
string LocalFullPath = Path.Combine(LocalPath, LocalFileName);
if (File.Exists(LocalFullPath))
{
throw new Exception("當前路徑下已經存在同名文件!");
}
bt = DownloadFile(RemoteFileName);
if (bt != null)
{
FileStream stream = new FileStream(LocalFullPath, FileMode.Create);
stream.Write(bt, 0, bt.Length);
stream.Flush();
stream.Close();
return true;
}
else
{
return false;
}
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
///
/// 從FTP服務器下載文件,返回文件二進制數據
///
/// 遠程文件名
public byte[] DownloadFile(string RemoteFileName)
{
try
{
if (!IsValidFileChars(RemoteFileName))
{
throw new Exception("非法文件名或目錄名!");
}
Response = Open(new Uri(this.Uri.ToString() + RemoteFileName), WebRequestMethods.Ftp.DownloadFile);
Stream Reader = Response.GetResponseStream();
MemoryStream mem = new MemoryStream(1024 * 500);
byte[] buffer = new byte[1024];
int bytesRead = 0;
int TotalByteRead = 0;
while (true)
{
bytesRead = Reader.Read(buffer, 0, buffer.Length);
TotalByteRead += bytesRead;
if (bytesRead == 0)
break;
mem.Write(buffer, 0, bytesRead);
}
if (mem.Length > 0)
{
return mem.ToArray();
}
else
{
return null;
}
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
#endregion
#region 異步下載文件
///
/// 從FTP服務器異步下載文件,指定本地路徑和本地文件名
///
/// 遠程文件名
/// 保存文件的本地路徑,後面帶有"\"
/// 保存本地的文件名
public void DownloadFileAsync(string RemoteFileName, string LocalPath, string LocalFileName)
{
byte[] bt = null;
try
{
if (!IsValidFileChars(RemoteFileName) || !IsValidFileChars(LocalFileName) || !IsValidPathChars(LocalPath))
{
throw new Exception("非法文件名或目錄名!");
}
if (!Directory.Exists(LocalPath))
{
throw new Exception("本地文件路徑不存在!");
}
string LocalFullPath = Path.Combine(LocalPath, LocalFileName);
if (File.Exists(LocalFullPath))
{
throw new Exception("當前路徑下已經存在同名文件!");
}
DownloadFileAsync(RemoteFileName, LocalFullPath);
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
///
/// 從FTP服務器異步下載文件,指定本地完整路徑文件名
///
/// 遠程文件名
/// 本地完整路徑文件名
public void DownloadFileAsync(string RemoteFileName, string LocalFullPath)
{
try
{
if (!IsValidFileChars(RemoteFileName))
{
throw new Exception("非法文件名或目錄名!");
}
if (File.Exists(LocalFullPath))
{
throw new Exception("當前路徑下已經存在同名文件!");
}
MyWebClient client = new MyWebClient();
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
client.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(client_DownloadFileCompleted);
client.Credentials = new NetworkCredential(this.UserName, this.Password);
if (this.Proxy != null)
{
client.Proxy = this.Proxy;
}
client.DownloadFileAsync(new Uri(this.Uri.ToString() + RemoteFileName), LocalFullPath);
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
///
/// 異步下載文件完成之後觸發的事件
///
/// 下載對象
/// 數據信息對象
void client_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
if (DownloadDataCompleted != null)
{
DownloadDataCompleted(sender, e);
}
}
///
/// 異步下載進度發生改變觸發的事件
///
/// 下載對象
/// 進度信息對象
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
if (DownloadProgressChanged != null)
{
DownloadProgressChanged(sender, e);
}
}
#endregion
#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 listFile = new List();
foreach (FileStruct file in listAll)
{
if (!file.IsDirectory)
{
listFile.Add(file);
}
}
return listFile.ToArray();
}
///
/// 列出FTP服務器上面當前目錄的所有的目錄
///
public FileStruct[] ListDirectories()
{
FileStruct[] listAll = ListFilesAndDirectories();
List listDirectory = new List();
foreach (FileStruct file in listAll)
{
if (file.IsDirectory)
{
listDirectory.Add(file);
}
}
return listDirectory.ToArray();
}
///
/// 獲得文件和目錄列表
///
/// FTP返回的列表字符信息
private FileStruct[] GetList(string datastring)
{
List myListArray = new 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
#region 重命名文件
///
/// 更改一個文件的名稱或一個目錄的名稱
///
/// 原始文件或目錄名稱
/// 新的文件或目錄的名稱
public bool ReName(string RemoteFileName, string NewFileName)
{
try
{
if (!IsValidFileChars(RemoteFileName) || !IsValidFileChars(NewFileName))
{
throw new Exception("文件名非法!");
}
if (RemoteFileName == NewFileName)
{
return true;
}
if (FileExist(RemoteFileName))
{
Request = OpenRequest(new Uri(this.Uri.ToString() + RemoteFileName), WebRequestMethods.Ftp.Rename);
Request.RenameTo = NewFileName;
Response = (FtpWebResponse)Request.GetResponse();
}
else
{
throw new Exception("文件在服務器上不存在!");
}
return true;
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
#endregion
#region 拷貝、移動文件
///
/// 把當前目錄下面的一個文件拷貝到服務器上面另外的目錄中,注意,拷貝文件之後,當前工作目錄還是文件原來所在的目錄
///
/// 當前目錄下的文件名
/// 新目錄名稱。
/// 說明:如果新目錄是當前目錄的子目錄,則直接指定子目錄。如: SubDirectory1/SubDirectory2 ;
/// 如果新目錄不是當前目錄的子目錄,則必須從根目錄一級一級的指定。如: ./NewDirectory/SubDirectory1/SubDirectory2
///
///
public bool CopyFileToAnotherDirectory(string RemoteFile, string DirectoryName)
{
string CurrentWorkDir = this.DirectoryPath;
try
{
byte[] bt = DownloadFile(RemoteFile);
GotoDirectory(DirectoryName);
bool Success = UploadFile(bt, RemoteFile, false);
this.DirectoryPath = CurrentWorkDir;
return Success;
}
catch (Exception ep)
{
this.DirectoryPath = CurrentWorkDir;
ErrorMsg = ep.ToString();
throw ep;
}
}
///
/// 把當前目錄下面的一個文件移動到服務器上面另外的目錄中,注意,移動文件之後,當前工作目錄還是文件原來所在的目錄
///
/// 當前目錄下的文件名
/// 新目錄名稱。
/// 說明:如果新目錄是當前目錄的子目錄,則直接指定子目錄。如: SubDirectory1/SubDirectory2 ;
/// 如果新目錄不是當前目錄的子目錄,則必須從根目錄一級一級的指定。如: ./NewDirectory/SubDirectory1/SubDirectory2
///
///
public bool MoveFileToAnotherDirectory(string RemoteFile, string DirectoryName)
{
string CurrentWorkDir = this.DirectoryPath;
try
{
if (DirectoryName == "")
return false;
if (!DirectoryName.StartsWith("/"))
DirectoryName = "/" + DirectoryName;
if (!DirectoryName.EndsWith("/"))
DirectoryName += "/";
bool Success = ReName(RemoteFile, DirectoryName + RemoteFile);
this.DirectoryPath = CurrentWorkDir;
return Success;
}
catch (Exception ep)
{
this.DirectoryPath = CurrentWorkDir;
ErrorMsg = ep.ToString();
throw ep;
}
}
#endregion
#region 建立、刪除子目錄
///
/// 在FTP服務器上當前工作目錄建立一個子目錄
///
/// 子目錄名稱
public bool MakeDirectory(string DirectoryName)
{
try
{
if (!IsValidPathChars(DirectoryName))
{
throw new Exception("目錄名非法!");
}
if (DirectoryExist(DirectoryName))
{
throw new Exception("服務器上面已經存在同名的文件名或目錄名!");
}
Response = Open(new Uri(this.Uri.ToString() + DirectoryName), WebRequestMethods.Ftp.MakeDirectory);
return true;
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
///
/// 從當前工作目錄中刪除一個子目錄
///
/// 子目錄名稱
public bool RemoveDirectory(string DirectoryName)
{
try
{
if (!IsValidPathChars(DirectoryName))
{
throw new Exception("目錄名非法!");
}
if (!DirectoryExist(DirectoryName))
{
throw new Exception("服務器上面不存在指定的文件名或目錄名!");
}
Response = Open(new Uri(this.Uri.ToString() + DirectoryName), WebRequestMethods.Ftp.RemoveDirectory);
return true;
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
#endregion
#region 文件、目錄名稱有效性判斷
///
/// 判斷目錄名中字符是否合法
///
/// 目錄名稱
public bool IsValidPathChars(string DirectoryName)
{
char[] invalidPathChars = Path.GetInvalidPathChars();
char[] DirChar = DirectoryName.ToCharArray();
foreach (char C in DirChar)
{
if (Array.BinarySearch(invalidPathChars, C) >= 0)
{
return false;
}
}
return true;
}
///
/// 判斷文件名中字符是否合法
///
/// 文件名稱
public bool IsValidFileChars(string FileName)
{
char[] invalidFileChars = Path.GetInvalidFileNameChars();
char[] NameChar = FileName.ToCharArray();
foreach (char C in NameChar)
{
if (Array.BinarySearch(invalidFileChars, C) >= 0)
{
return false;
}
}
return true;
}
#endregion
#region 目錄切換操作
///
/// 進入一個目錄
///
///
/// 新目錄的名字。
/// 說明:如果新目錄是當前目錄的子目錄,則直接指定子目錄。如: SubDirectory1/SubDirectory2 ;
/// 如果新目錄不是當前目錄的子目錄,則必須從根目錄一級一級的指定。如: ./NewDirectory/SubDirectory1/SubDirectory2
///
public bool GotoDirectory(string DirectoryName)
{
string CurrentWorkPath = this.DirectoryPath;
try
{
DirectoryName = DirectoryName.Replace("\\", "/");
string[] DirectoryNames = DirectoryName.Split(new char[] { '/' });
if (DirectoryNames[0] == ".")
{
this.DirectoryPath = "/";
if (DirectoryNames.Length == 1)
{
return true;
}
Array.Clear(DirectoryNames, 0, 1);
}
bool Success = false;
foreach (string dir in DirectoryNames)
{
if (dir != null)
{
Success = EnterOneSubDirectory(dir);
if (!Success)
{
this.DirectoryPath = CurrentWorkPath;
return false;
}
}
}
return Success;
}
catch (Exception ep)
{
this.DirectoryPath = CurrentWorkPath;
ErrorMsg = ep.ToString();
throw ep;
}
}
///
/// 從當前工作目錄進入一個子目錄
///
/// 子目錄名稱
private bool EnterOneSubDirectory(string DirectoryName)
{
try
{
if (DirectoryName.IndexOf("/") >= 0 || !IsValidPathChars(DirectoryName))
{
throw new Exception("目錄名非法!");
}
if (DirectoryName.Length > 0 && DirectoryExist(DirectoryName))
{
if (!DirectoryName.EndsWith("/"))
{
DirectoryName += "/";
}
_DirectoryPath += DirectoryName;
return true;
}
else
{
return false;
}
}
catch (Exception ep)
{
ErrorMsg = ep.ToString();
throw ep;
}
}
///
/// 從當前工作目錄往上一級目錄
///
public bool ComeoutDirectory()
{
if (_DirectoryPath == "/")
{
ErrorMsg = "當前目錄已經是根目錄!";
throw new Exception("當前目錄已經是根目錄!");
}
char[] sp = new char[1] { '/' };
string[] strDir = _DirectoryPath.Split(sp, StringSplitOptions.RemoveEmptyEntries);
if (strDir.Length == 1)
{
_DirectoryPath = "/";
}
else
{
_DirectoryPath = String.Join("/", strDir, 0, strDir.Length - 1);
}
return true;
}
#endregion
#region 重載WebClient,支持FTP進度
internal class MyWebClient : WebClient
{
protected override WebRequest GetWebRequest(Uri address)
{
FtpWebRequest req = (FtpWebRequest)base.GetWebRequest(address);
req.UsePassive = false;
return req;
}
}
#endregion
}
}
品客的洋芋片工廠
雜七雜八~
2014年1月8日 星期三
C# FTP 上傳、下載、異步
包好的ftp類~~好用
2014年1月7日 星期二
實現對一個文件md5的讀取
實現對一個文件md5的讀取
/// 實現對一個文件md5的讀取,path為文件路徑
public string md5_hash(string path)
{
try
{
FileStream get_file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
System.Security.Cryptography.MD5CryptoServiceProvider get_md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] hash_byte = get_md5.ComputeHash(get_file);
string resule = System.BitConverter.ToString(hash_byte);
resule = resule.Replace("-", "");
return resule;
}
catch (Exception e)
{
return e.ToString();
}
}
2013年12月26日 星期四
2013年12月19日 星期四
c# 用hwnd截圖,無論是否被遮擋
#region 使用PrintWindow方法抓取窗口,無論控件是否被遮擋 ///會用到的dll/// 窗口的截圖,窗口被遮擋時也可以正確截圖,使用PrintWindow方法 /// /// 需要被截圖的窗口 ///窗口的截圖,控件被遮擋時也可以正確截圖 private static Bitmap GetWindow(IntPtr hWnd) { IntPtr hscrdc = GetWindowDC(hWnd); Rectangle rect = new Rectangle(); GetWindowRect(hWnd, out rect); IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, rect.Width, rect.Height); IntPtr hmemdc = CreateCompatibleDC(hscrdc); SelectObject(hmemdc, hbitmap); PrintWindow(hWnd, hmemdc, 0); Bitmap bmp = Bitmap.FromHbitmap(hbitmap); DeleteDC(hscrdc);//刪除用過的對象 DeleteDC(hmemdc);//刪除用過的對象 return bmp; } #endregion
[DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleDC(
IntPtr hdc // handle to DC
);
[DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleBitmap(
IntPtr hdc, // handle to DC
int nWidth, // width of bitmap, in pixels
int nHeight // height of bitmap, in pixels
);
[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(
IntPtr hdc, // handle to DC
IntPtr hgdiobj // handle to object
);
[DllImport("gdi32.dll")]
public static extern int DeleteDC(
IntPtr hdc // handle to DC
);
[DllImport("user32.dll")]
public static extern bool PrintWindow(
IntPtr hwnd, // Window to copy,Handle to the window that will be copied.
IntPtr hdcBlt, // HDC to print into,Handle to the device context.
UInt32 nFlags // Optional flags,Specifies the drawing options. It can be one of the following values.
);
[DllImport("user32.dll")]
public static extern IntPtr GetWindowDC(
IntPtr hwnd // Window to copy,Handle to the window that will be copied.
);
2009年12月2日 星期三
品客繁體化UI:DailyNotes中文化版(11/30 18:07 ver.1.9.2)
品客繁體化UI:DailyNotes中文化版(11/30 18:07 ver.1.9.2)
功能有:所有每日任務的道具, 顯示 接任務位置的告示板 / 經驗值 / 金錢 / 數量需求
11/30 更新並修正到版本1.92
11/5 修正三個BUG
1.修正1.81版本載入"未開放區域"任務讀取錯誤。
2.修正"未開放區域"任務ToolTips出錯。
3.修正點擊任務產生連結npc座標未知報錯的問題,將未知座標npc顯示為未知目標且修正點擊報錯的問題。
輸入/dn打開設定介面

此版本為中文化版本,DailyNotes 版權仍為原作者McBen所有。
功能有:所有每日任務的道具, 顯示 接任務位置的告示板 / 經驗值 / 金錢 / 數量需求
11/30 更新並修正到版本1.92
11/5 修正三個BUG
1.修正1.81版本載入"未開放區域"任務讀取錯誤。
2.修正"未開放區域"任務ToolTips出錯。
3.修正點擊任務產生連結npc座標未知報錯的問題,將未知座標npc顯示為未知目標且修正點擊報錯的問題。
輸入/dn打開設定介面

此版本為中文化版本,DailyNotes 版權仍為原作者McBen所有。
品客繁體化UI:EasyChatChange中文化版(10/13 17:32 ver.0.61)
品客繁體化UI:EasyChatChange中文化版(10/13 17:32 ver.0.61)
很方便的頻道UI...可以直接切換頻道。

此版本為中文化版本,EasyChatChange版權仍為原作者Dinalisa所有。
很方便的頻道UI...可以直接切換頻道。

此版本為中文化版本,EasyChatChange版權仍為原作者Dinalisa所有。
品客繁體化UI:RuneCraft中文化版(9/23 21:33 ver.0.4)
品客繁體化UI:RuneCraft中文化版(9/23 21:33 ver.0.4)
魔幻寶盒合成符文教學UI....Curse上已經沒有了...原作者失蹤啦!!
此為我修改的0.4版..除中文化外..修正一些階層的符文融合公式缺少的問題
對話欄輸入 /rc 開啟介面。
魔幻寶盒合成符文教學UI....Curse上已經沒有了...原作者失蹤啦!!
此為我修改的0.4版..除中文化外..修正一些階層的符文融合公式缺少的問題
對話欄輸入 /rc 開啟介面。
訂閱:
意見 (Atom)
