LibCurl SFTP重命名文件

时间:2011-01-24 14:04:54

标签: libcurl rename sftp

已解决......

在更多转换之后,通过使用“rename”作为引用命令,它需要包含原始名称和完整路径(包括重命名到目标)的完整路径。我没有尝试过其他挫败尝试的路径。


大家好,我尝试了所有不同的组合,不断失败,不知道我错过了什么。我正在尝试使用Libcurl在SFTP站点上进行简单的文件重命名。我一直都在寻找答案,但不断提出来。

BTW ...对于此测试,文件夹中只有一个文件名,因此没有关于现有文件覆盖的问题...而且我是最初为任何可能的“权限”问题上传文件的登录用户

我的第一个测试是获得所期望的简单语法正确,但结果不然。我首先开始使用NON-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 );

当我执行此操作时,我得到一个CURL ERROR ...

但是,如果我不尝试“mv”命令并且只发送“pwd”的QUOTE命令,它会很好地执行并且它会正确列出预期的文件夹/子目录我正在尝试重命名该文件所以我知道它在正确的目录中。我在“RemoteCurrentFileName”和“RemoteRenameToName”中的值只是文件的主干,分别没有完整的路径。我也试过包括完整路径,两个版本都失败了。例如:

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

此外,我查看了文档,并注意到“重命名”是一个有效的“QUOTE”命令,并尝试过这个...

rename "original file" "new file"

那也失败了

这应该不难做到。我错过了什么简单/愚蠢...这完全令人沮丧。

1 个答案:

答案 0 :(得分:1)

已解决......

在更多转换之后,通过使用“rename”作为引用命令,它需要包含原始名称和完整路径(包括重命名到目标)的完整路径。在我的其他挫败尝试中,我没有试过这条道路

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);