2011-03-26 212 views
0

我有這個簡單的代碼上傳文件到服務器,但它似乎不工作,不上傳任何文件(FtpPutFile返回0)。我正在使用FileZilla服務器,這是我的代碼和FileZilla所說的:無法上傳文件到FTP服務器使用C++

void upload() 
{ 
    hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); 
    hFtpSession = InternetConnect(hInternet,"127.0.0.1",INTERNET_DEFAULT_FTP_PORT,"vbx","pass",INTERNET_SERVICE_FTP, 0,0); 
    FtpPutFile(hFtpSession, "c:\\stories.txt", "e:\\text.txt", FTP_TRANSFER_TYPE_BINARY, 0); 
    InternetCloseHandle(hFtpSession); 
    InternetCloseHandle(hInternet); 
} 

(000011)3/27/2011 0:01:53 AM - (not logged in) (127.0.0.1)> USER vbx 
(000011)3/27/2011 0:01:53 AM - (not logged in) (127.0.0.1)> 331 Password required for vbx 
(000011)3/27/2011 0:01:53 AM - (not logged in) (127.0.0.1)> PASS ******* 
(000011)3/27/2011 0:01:53 AM - vbx (127.0.0.1)> 230 Logged on 
(000011)3/27/2011 0:01:53 AM - vbx (127.0.0.1)> disconnected. 

謝謝。

編輯:GetLastError() returns: The process cannot access the file because it is being used by another process.

+0

什麼是錯誤檢查讓你(即檢查返回並調用GetLastError())? – 2011-03-26 22:08:41

+0

它返回ERROR_SUCCES – Kobe 2011-03-26 22:14:34

+0

對不起,我犯了一個錯誤,是的,它返回一個錯誤(32):進程無法訪問該文件,因爲它正在被另一個進程使用。 – Kobe 2011-03-26 22:15:54

回答

1

隨着GetLastError函數()返回用於FtpPutFile ERROR_SHARING_VIOLATION(32),它可能意味着有一個打開的句柄 「C:\ stories.txt的」 防止讀共享。如果在程序中打開了此文件,則需要在CreateFile調用中允許讀共享,或者關閉所有打開的防止共享的句柄,以便FtpPutFile可以打開該文件。

+0

注意:如果您之前正在寫入有問題的文件,並且您選擇允許讀共享並保持該句柄處於打開狀態,則您需要調用FlushFileBuffers以確保將寫入操作刷新到文件。當然,如果您在文件上傳到服務器時在另一個線程上寫入文件,則服務器上的內容可能不符合您的期望。 – 2011-03-26 22:50:19