LibCurl SFTP Переименовать файл - PullRequest
3 голосов
/ 24 января 2011

решено ...

После еще большего перемещения, используя команду «переименовать» в качестве команды в кавычках, потребовался полный путь, включая исходное имя, и полный путь, включая переименование до места назначения. Я не пробовал с путем в других моих неудачных попытках.


Привет всем, я пробовал все разные комбинации, продолжаю терпеть неудачу и не знаю, что мне не хватает. Я пытаюсь сделать простое переименование файла на SFTP-сайте с помощью Libcurl. Я искал ответы повсюду, но продолжаю набирать обороты.

Кстати ... Для этого тестирования в папке есть только одно имя файла, поэтому никаких проблем с перезаписью существующих файлов ... И я являюсь пользователем, который первоначально загрузил файл для любых возможных проблем с "разрешениями" .

Мой первый тест состоял в том, чтобы получить то, что ожидалось, как правильный синтаксис, но результат был иным. Сначала я начал с 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 );

Затем я получаю ОШИБКУ СЕРБ, когда я выполняю это ...

Однако, если я не попробую команду "mv" и отправлю только команду QUOTE "pwd", она проходит нормально и правильно отображает ожидаемую папку / подкаталог, в котором я пытаюсь переименовать файл. Так что я знаю его в правильном каталоге. Значения, которые у меня есть в «RemoteCurrentFileName» и «RemoteRenameToName», являются только основами файла, а не полным путем к ним соответственно. Я также попытался включить полный путь, и обе версии потерпели неудачу. Пример:

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

Кроме того, я просмотрел документацию и отметил, что «переименовать» является допустимой командой «QUOTE», и тоже попробовал это.

rename "original file" "new file"

и это тоже не удалось

Это не должно быть так сложно сделать. Какого простого / глупого мне не хватает ... Это очень расстраивает.

1 Ответ

1 голос
/ 24 января 2011

решено ...

После еще большего перемещения, используя команду «переименовать» в качестве команды в кавычках, потребовался полный путь, включая исходное имя, и полный путь, включая переименование до места назначения. Я не пробовал с путем в других моих неудачных попытках

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