2015-03-24 97 views
1

我遇到FTP觀察器服務和File.Move方法的問題。使用File.Move時出現FTP問題 - C#

FTP服務器是一個簡單的IIS 8.5 FTP站點,FTP客戶端是FileZilla的FTP客戶端

Windows服務將輪詢的目錄中的文件將被刪除。

第一個任務是使用靜態File.Move方法重命名文件。 其次,是使用靜態File.Copy方法將文件複製到另一個目錄。

問題是,當文件正在傳輸時,File.Copy將正確地拋出一個IO異常(如果使用的話),並顯示消息「該文件正在被另一個進程使用」。

但是,File.Move將執行它的任務,而不會在文件仍在傳輸時拋出任何異常。這是這種方法的正確行爲嗎?我一直無法找到任何有關這種情況的信息。我的印象是,如果File.Move用在另一個進程正在使用的文件上,那麼它會拋出一個異常[FTP Transfer],但似乎沒有。

有沒有人經歷過這種和/或擁有的File.Move方法的行爲的解釋

回答

0

複製文件需要打開文件以進行讀取訪問。 FTP服務器當前已打開該文件,因此無法打開該文件進行閱讀。

移動文件不需要打開文件進行讀取訪問,除非文件位於與目標不同的捲上。

由於將文件移動到相同的卷只需要刪除訪問權限而不是讀取訪問權限,因此FTP服務器必須鎖定文件進行讀取和寫入,但不能刪除。

+0

謝謝加貝,這些信息也幫助我 – polydegmon 2015-03-25 16:31:02

0

此代碼表明,當您嘗試移動File.Move的確會拋出一個異常,如果該文件正在使用它,所以我認爲你的前提是不正確的。

var filePath = @"d:\public\temp\temp.txt"; 
var moveToPath = @"d:\public\temp\temp2.txt"; 

// Create a stream reader so the file is 'in use' 
using (var fileStream = new StreamReader(filePath)) 
{ 
    // This will fail with an IO exception 
    File.Move(filePath, moveToPath); 
} 

例外:

,因爲它被另一個進程的進程不能訪問該文件。

0

移動文件有效地實現爲單純重命名,只需要在目標和源目錄上寫入許可。對於真正的副本,您需要讀取文件本身的權限。由於源文件上存在獨佔鎖,所以副本將會失敗,但是移動將會成功。

+0

我讀到這個問題的方式,是發生問題的服務器,而不是客戶端,所以FileZilla沒有影響。 – Gabe 2015-03-24 22:28:17

+0

這是有道理的,謝謝你的信息雅科 – polydegmon 2015-03-25 16:30:26