寫程式這麼多年,第一次遇到要在FTP Server搬檔案的需求,特此PO文一篇留念。

原本很擔心我大戰FTP的得力助手--FtpWebRequest不支援這個較少見的需求,看了一下WebRequestMethods.Ftp,還真沒看到Move、MoveFolder之類的項目。且慢,原來這裡有一個隱藏密技,Rename時把目錄也換掉,就可達到搬檔案的效果了。程式範例如下,請笑納。

static void Main(string[] args)
{
    string url = "ftp://192.168.1.1/origFolder/origFile.txt";
    FtpWebRequest req = FtpWebRequest.Create(url) as FtpWebRequest;
    req.Credentials = new NetworkCredential("username", "password");
    req.Method = WebRequestMethods.Ftp.Rename;
    req.RenameTo = "/newFolder/newFileName.txt";
    try
    {
        using (StreamReader sr = 
            new StreamReader(req.GetResponse().GetResponseStream()))
        {
   //測試發現,正常時傳回的是空字串,不用處理
            string result = sr.ReadToEnd();
        }
    }
    catch (Exception ex)
    {
        //... 錯誤處理 ...
    }
}

Comments

# by Tom

奇怪, 這類需求感覺還蠻常見的啊? 如果不同的 server 要透過中控的 FTP server 作檔案交換或處理, 利用 FTP client pooling, 一定會需要將 download 過的檔案從 server 上面移除或移往他處啊. 這在 Banking 作 batch 很常遇到...

# by 大估

黑暗大大好: 小弟想在此請問一個需求:有沒有辦法用FtpWebRequest對Ftp Server中,對某個檔案進行複製,並在Ftp Server上新增另一個目錄,將剛才複製的檔案貼上? 小弟之前有在網路上查了一下,似乎FtpWebRequest沒有辦法下指令複製檔案,因此,最後我是在Ftp Server上架Web站台,以Web Service方式解決... 謝黑暗大大~~

# by Jeffrey

to 大估,依我的了解,Copy檔案並不是FTP的標準指令(Ref: http://www.nsftools.com/tips/MSFTP.htm)。你用Web Service是一種解法,另一種我想到的做法是若檔案不大,由Client端下載回來,再上傳到另一個目錄下,形同Copy

# by 大估

在此謝過黑暗大了~~ 我之前也查過,COPY不是FTP的標準指令,就算是用WIN32API來作,也是沒辦法複製的...(殘念) 至於黑暗大提的另一個作法,也是我原本的作法,下載再上傳一次,但公司的個人電腦及網路,不是很好,所以這個方式沒多久就有人反應慢了,因此後來才改寫了Web Service的解法。 無論如何,還是要謝謝黑暗大大了~

# by asam

從sql2005使用匯出精靈將TABLE資料(約2百萬多筆)匯至另一台SQL2005使用資料來源與目的為SQL NATIVE CLIENT 結果出現錯誤訊息: [OLE DB 目的地 [1055]] 錯誤: SSIS 錯誤碼 DTS_E_OLEDBERROR。發生 OLE DB 錯誤。錯誤碼: 0x80004005。 有 OLE DB 記錄可用。來源: "Microsoft OLE DB Provider for SQL Server" Hresult: 0x80004005 描述: "連結伺服器 '(null)' 的 OLE DB 提供者 'STREAM' 傳回無效的資料給資料行 '[!BulkInsert].name'。"。 [DTS.Pipeline] 錯誤: SSIS 錯誤碼 DTS_E_PROCESSINPUTFAILED。在元件 "OLE DB 目的地" (1055) 上的 ProcessInput 方法失敗,錯誤碼為 0xC0202009。識別的元件從 ProcessInput 方法傳回錯誤。此錯誤是元件特定的錯誤,但屬於嚴重錯誤,將導致資料流程工作停止執行。在此之前可能已公佈過錯誤訊息,說明有關此失敗的詳細資訊。 [DTS.Pipeline] 錯誤: SSIS 錯誤碼 DTS_E_THREADFAILED。"WorkThread0" 執行緒已結束,錯誤碼為 0xC0202009。在此之前可能已公佈過錯誤訊息,說明執行緒為何結束的詳細資訊。 簡單的匯出TABLE為什麼會出錯呢>< 似乎只有大TABLE有問題 ? 請問該如何解決 = =?

# by Adam

多謝! 同樣的方式在其他元件也解決. 剛用公司的Starksoft元件的Move功能時也遇到問題, 由FTP Server Move到另一目錄時, 檔案是空的. 後來用Rename指令解決了.

Post a comment