使用NET內建FTP出現中文檔名變亂碼
本來興高采烈的寫出NET 上傳下載的FTP後測試一切正常,結果在最後階段發現中文檔名出現亂碼(內文正常),查了老半天因為能力不足無法解決,最後只好靠不太會操作的 win32API終於解決了中文檔名的問題,不過也折騰了好幾天,真是要多加油了><。 NET 的FTP改成可以多個檔案上傳並且再最後一的檔案時關閉FTP連線使用ftpReq.KeepAlive = true; NET竟然沒有CLOSE 所以我也沒辦法測試這樣是否真的關閉,至於API部分,由於目前台灣時間是早上五點半,在不睡就要死了,所以改天有機會再寫了
上傳檔案部份
下載檔案部份
查詢遠端檔案部份
上傳檔案部份
public void FileUpload(string[] arryFileName)
{
Stream requestStream = null;
FileStream fileStream = null;
FtpWebResponse ftpRep = null;
string strFileName;
int intAryLen = arryFileName.GetLength(0);
for (int i = 0; i < intAryLen; i++)
{
try
{
strFileName = System.IO.Path.GetFileName(arryFileName[i]);
FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create("ftp://FTPHost/檔案名稱");
ftpReq.Method = WebRequestMethods.Ftp.UploadFile;
ftpReq.Proxy = null; ftpReq.UsePassive = false;
ftpReq.Credentials = new NetworkCredential("FTPUserID", "FTPPwd");
ftpReq.UseBinary = true;
if (i == intAryLen - 1)
{
//最後一個檔案時關閉
ftpReq.KeepAlive = true;
}
else
{
ftpReq.KeepAlive = false;
}
requestStream = ftpReq.GetRequestStream();
fileStream = File.Open(arryFileName[i], FileMode.Open);
byte[] buffer = new byte[2048]; int intbytes;
while (true)
{
intbytes = fileStream.Read(buffer, 0, buffer.Length);
if (intbytes == 0) break;
requestStream.Write(buffer, 0, intbytes);
}
requestStream.Close();
ftpRep = (FtpWebResponse)ftpReq.GetResponse();
}
catch (Exception ex) { }
finally
{
if (ftpRep != null) ftpRep.Close();
if (fileStream != null) fileStream.Close();
if (requestStream != null) requestStream.Close();
}
}
}
下載檔案部份
public void FileDownload(string[] arryFileName)
{
string strSavePath = Application.StartupPath + "\\DownloadBuf\\";
Stream responseStream = null;
FileStream fileStream = null;
StreamReader reader = null;
string strFileName = "";
int intAryLen = arryFileName.GetLength(0);
FtpWebResponse ftpRep = null;
for (int i = 0; i < intAryLen; i++)
{
try
{
strFileName = System.IO.Path.GetFileName(arryFileName[i]);
FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create("ftp://FTPHost名稱/檔案名稱");
ftpReq.Method = WebRequestMethods.Ftp.DownloadFile;
ftpReq.Credentials = new NetworkCredential("FTPUserID", "FTPPwd");
ftpReq.UseBinary = true;
if (i == intAryLen - 1)
{
ftpReq.KeepAlive = true;//最後一個檔案時關閉
}
else
{
ftpReq.KeepAlive = false;
}
ftpRep = (FtpWebResponse)ftpReq.GetResponse();
responseStream = ftpRep.GetResponseStream();//取得FTP伺服器回傳的資料流
string fileName = Path.GetFileName(ftpReq.RequestUri.AbsolutePath);
if (fileName.Length == 0)
{
reader = new StreamReader(responseStream);
throw new Exception(reader.ReadToEnd());
}
else
{
fileStream = File.Create(strSavePath + fileName);
byte[] buffer = new byte[1024];
int bytesRead;
while (true)
{
bytesRead = responseStream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0) break;
fileStream.Write(buffer, 0, bytesRead);
}
}
}
catch (IOException ex) { }
finally
{
if (ftpRep != null) ftpRep.Close();
if (reader != null)
{
reader.Close();
}
else if (responseStream != null)
{
responseStream.Dispose();
responseStream.Close();
}
if (fileStream != null) fileStream.Close();
}
}
}
StreamReader reader = null;
try
{
FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create("ftp://FTPHost名稱/");
ftpReq.Credentials = new NetworkCredential("FTPUserID", "FTPPwd");
ftpReq.Method = WebRequestMethods.Ftp.ListDirectory;// //設定Method取得簡短目錄資訊
//ftpReq.Method = WebRequestMethods.Ftp.ListDirectoryDetails;// //設定Method取得詳細目錄資訊
ftpReq.UsePassive = false;
FtpWebResponse ftpRep = (FtpWebResponse)ftpReq.GetResponse();
reader = new StreamReader(ftpRep.GetResponseStream(), System.Text.Encoding.Default);
//開始讀取回傳資訊
while (reader.Peek() >= 0)
{
string[] arryBuf = reader.ReadLine().Split(' ');
string strNewBuf = "";
foreach (string strBuf in arryBuf)
{
if (strBuf.Trim() == "")
{
strNewBuf = "@@@";
}
else
{
strNewBuf = strBuf;
}
//listBox1.Items.Add(strNewBuf);
}
}
}
catch (Exception ex) { }
finally
{
if (reader != null) reader.Close();
}
留言
張貼留言
您好,我是 Lawrence,這裡是我的開發筆記的網誌,如果你對我的文章有任何疑問或者有錯誤的話,歡迎留言讓我知道。