2011-01-24 109 views
3

解決...libcurl的SFTP重命名文件

更多轉向周圍,通過使用「重命名」所引用的命令後,它需要的完整路徑,包括原來的全路徑名和包容性的命名,到目的地的。在我的其他挫折嘗試中,我沒有嘗試過這條路。大家好,我嘗試過所有不同的組合,不斷失敗,不知道我失蹤了。我正在嘗試使用Libcurl在SFTP站點上進行簡單的文件重命名。我已經找遍了所有的答案,但不斷地提出來。

BTW ......對於這個測試,有文件夾中只有一個文件名,所以沒有對現有文件的問題覆蓋......而我是誰最初上傳文件的任何可能的「權限」登錄用戶的問題。

我的第一個測試是讓這將是預期的那樣簡單的語法正確,但是沒有結果。我從一個非SFTP站點開始......只是普通的FTP。

// ex: fpt://mysite.com/subpathNeeded/ 
curl_easy_setopt(MyCurl, CURLOPT_URL, RemotePath); 


// need a "QUOTE" command before rename will occur in postQuote 
strcpy_s(NewCmd, _countof(NewCmd), "PWD \0"); 
quotelist = curl_slist_append(quotelist, NewCmd); 

// NOW, we can issue the rename from and rename to commands 
strcpy_s(RenameFrom, _countof(RenameFrom), "RNFR "); 
strcat_s(RenameFrom, _countof(RenameFrom), RemoteCurrentFileName); 
postquotelist = curl_slist_append(postquotelist, RenameFrom); 

strcpy_s(RenameTo, _countof(RenameTo), "RNTO "); 
strcat_s(RenameTo, _countof(RenameTo), RemoteRenameToName); 
postquotelist = curl_slist_append(postquotelist, RenameTo); 

curl_easy_setopt(MyCurl, CURLOPT_QUOTE, quotelist); 
curl_easy_setopt(MyCurl, CURLOPT_POSTQUOTE, postquotelist); 

// NOW, perform the print working directory, then rename... 
MyCurlResult = curl_easy_perform(MyCurl); 

這工作沒問題。所以,現在,我切換到SFTP和失敗......通過研究,SFTP不喜歡「PWD」,但允許「PWD」(案號),沒有問題。然後,它不喜歡RNFR和RNTO,但確實接受「mv」(移動)。所以,如果我在SFTP模式的時候,我改變

// lower case "pwd" print working directory 
strcpy_s(NewCmd, _countof(NewCmd), "pwd\0"); 
quotelist = curl_slist_append(quotelist, NewCmd); 

// "mv" = move "originalfile" "newfile" 
strcpy_s(RenameFrom, _countof(RenameFrom), "mv \"\0"); 
strcat_s(RenameFrom, _countof(RenameFrom), RemoteCurrentFileName); 
strcat_s(RenameFrom, _countof(RenameFrom), "\" \"\0"); 
strcat_s(RenameFrom, _countof(RenameFrom), RemoteRenameToName); 
strcat_s(RenameFrom, _countof(RenameFrom), "\"\0"); 
postquotelist = curl_slist_append(postquotelist, RenameFrom); 

然後我得到的捲曲錯誤,當我執行此...

但是,如果我不嘗試的「MV」命令只發送的「PWD」的QUOTE命令,它會通過罰款,它不正確列出預期的文件夾/子目錄我試圖重命名文件,所以我知道它在正確的目錄。我曾經在「RemoteCurrentFileName」和「RemoteRenameToName」的值僅僅是莖的文件,分別沒有完整路徑給他們。我也試過包括完整路徑,並且兩個版本都失敗了。例如:

RemoteCurrentFileName = "FileIWantToRename.txt" 
    or 
RemoteCurrentFileName = "/subpathNeeded/FileIWantToRename.txt" 

另外,我看了看文件,並指出「重命名」,是一個有效的「QUOTE」命令,並嘗試了太..

rename "original file" "new file" 

和失敗過於

這不應該很難做到。我錯過了多少簡單/愚蠢......這完全令人沮喪。

回答

1

解決...

經過四處轉移,通過使用「重命名」所引用的命令時,它需要的完整路徑,包括原來的全路徑名和包容性的命名,到目的地的。我沒有嘗試在我的其他沮喪企圖路徑

strcpy_s(RenameFrom, _countof(RenameFrom), "rename \"\0"); 
strcat_s(RenameFrom, _countof(RenameFrom), RemoteCurrentFileNameWithFullPath); 
strcat_s(RenameFrom, _countof(RenameFrom), "\" \"\0"); 
strcat_s(RenameFrom, _countof(RenameFrom), RemoteRenameToNameWithFullPath); 
strcat_s(RenameFrom, _countof(RenameFrom), "\"\0"); 
quotelist = curl_slist_append(quotelist, RenameFrom); 

MyCurlResult = curl_easy_perform(MyCurl); 
+0

這很奇怪,我測試了絕對路徑和相對路徑,它工作得很好。在相對路徑的情況下,我使用的唯一的POSTQUOTE命令是:`重命名./my_sftp_path/file_original.foo。/ my_sftp_path/file_renamed.foo` – cesargastonec 2015-03-06 20:39:25