使用Win32 API FTP
由於使用NET FTP 會出現中文檔名下載回來後變亂碼的問題,因此改用WIN32的API來完成檔案的上傳下載及查詢
宣告完畢以後就可以進行實際操作了
using System.Runtime.InteropServices;
#region"定義API"
//產生Internet Session(InternetOpen)
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr InternetOpen(string strAppName, ulong
ulAccessType, string strProxy, string strProxyBypass, ulong ulFlags);
//產生FTP、HTTP...(InternetConnect)
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr InternetConnect(IntPtr ulSession, string strServer,
uint ulPort, string strUser, string strPassword, uint ulService, uint ulFlags, uint ulContext);
//關閉Internet Session(InternetClose)
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int InternetCloseHandle(ulong hInet);
//FTP上傳檔案
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool FtpPutFile(IntPtr ulSession, string strLocalFile,
string strServerFile, ulong ulFlags, ulong ulContext);
//FTP下載檔案
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool FtpGetFile(IntPtr ulSession, string strServerFile,
string strLocalFile, bool bolFailIfExist, ulong ulFlags, ulong ulInetFals, ulong ulContext);
//FTP刪除檔案
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool FtpDeleteFile(IntPtr ulSession, string strDelFile);
//瀏覽FTP伺服器目錄
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool FtpGetCurrentDirectory(IntPtr ulSession, string strDirPath, ref ulong ulBuffLength);
//建立目錄
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool FtpCreateDirectory(IntPtr ulSession, string strCreateDirectoryName);
//查找文件或目錄
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr FtpFindFirstFile(IntPtr hFtp, string lpszSearchFile,
ref WIN32_FIND_DATA lpFindFileData, int dwFlags, int dwContext);
//移到下一個文件或目錄是否存在
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool InternetFindNextFile(IntPtr ulFindFirst, ref WIN32_FIND_DATA lpFindFileData);
//改變目前資料夾
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool FtpSetCurrentDirectory(IntPtr ulSession, string strChangeDirectory);
//取得最號一個錯誤訊息
[DllImport("kernel32.dll", SetLastError = true)]
private static extern int GetLastError();
//查找文件或目錄回傳值定義
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct WIN32_FIND_DATA
{
public int dwFileAttributes;
public System.Runtime.InteropServices.ComTypes.FILETIME ftCreationTme;
public System.Runtime.InteropServices.ComTypes.FILETIME ftLastAccessTime;
public System.Runtime.InteropServices.ComTypes.FILETIME ftLastWriteTime;
public int nFileSizeHigh;
public int nFileSizeLow;
public int dwReserved0;
public int dwReserved1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
public string cAlternate;
}
const ulong INTERNET_OPEN_TYPE_PRECONFIG = 0;//預設proxy伺服器設定為主
const uint INTERNET_DEFAULT_FTP_PORT = 21;//設定internet服務之通訊port
const uint INTERNET_SERVICE_FTP = 1;//設定internet服務類型
const uint INTERNET_FLAG_NO_CACHE_WRITE = 0x4000000;//不將Internet連結資訊寫入快取(noncache)
const uint INTERNET_FLAG_PASSIVE = 0x800000;
const bool PassiveConnection = true;
const ulong FTP_TRANSFER_TYPE_UNKNOWN = 0x0;//預設使用Binary模式
const ulong FTP_ATTRIBUTE_DIRECTORY = 0x10;//判斷是否是資料夾
IntPtr hSession;
IntPtr hOpen;
IntPtr hFind;
#endregion
宣告完畢以後就可以進行實際操作了
留言
張貼留言
您好,我是 Lawrence,這裡是我的開發筆記的網誌,如果你對我的文章有任何疑問或者有錯誤的話,歡迎留言讓我知道。