VS2010下,
使用libcurl库,上传文件sftp服务器,是成功的。
但又想在sftp上新建文件夹,新建文件夹总是失败,但用FileZilla软件测试,可以正常在sftp上新建文件夹。
之前没用过sftp传文件,对libcurl也不太熟,所有想问下有没可以用的代码,发我抄抄。
#include<iostream>
#include <stdlib.h>
#include <stdio.h>
#include <curl/curl.h>
void CTest02Dlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
// sftp服务器的IP是192.168.2.15,端口是22,已有/test02/folder路径,想在test02/folder路径下建个20230510的文件夹
// sftp用户名sftpuser,密码123。
CURL *curl;
CURLcode res;
struct curl_slist *headerlist = NULL;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "sftp://192.168.2.15:22/test02/folder");
curl_easy_setopt(curl, CURLOPT_USERPWD,"sftpuser:123");
curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
headerlist = curl_slist_append(headerlist, "mkdir /test02/folder/20230510");
curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L); //0去掉调试信息, 1添加调试信息
res = curl_easy_perform(curl);// 这里返回的是res=CURLE_REMOTE_ACCESS_DENIED
curl_easy_cleanup(curl);
if(CURLE_OK != res)
{
fprintf(stderr, "curl told us %d\n", res);
}
curl_slist_free_all(headerlist);
}
curl_global_cleanup();
}
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
根据您提供的代码,我发现您的问题可能在于您没有设置CURLOPT_PROTOCOLS选项。默认情况下,libcurl只启用http和ftp协议,因此您需要使用CURLOPT_PROTOCOLS选项启用sftp协议。可以使用以下代码来设置:
curl_easy_setopt(curl, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
此外,您的代码中创建文件夹的命令可能不正确,应该使用mkdir命令而不是mkdir /test02/folder/20230510。因为您已经设置了CURLOPT_URL选项,所以只需要使用要创建的文件夹名称即可。
下面是完整的代码示例:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <curl/curl.h>
int main()
{
CURL *curl;
CURLcode res;
struct curl_slist *headerlist = NULL;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_easy_setopt(curl, CURLOPT_URL, "sftp://192.168.2.15:22/test02/folder");
curl_easy_setopt(curl, CURLOPT_USERPWD, "sftpuser:123");
headerlist = curl_slist_append(headerlist, "mkdir 20230510");
curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
curl_easy_cleanup(curl);
curl_slist_free_all(headerlist);
}
curl_global_cleanup();
return 0;
}
此代码应该能够成功创建文件夹。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
这里有个链接参考,应该符合:
http://t.csdn.cn/rWSxe
创建服务器文件夹失败,原因比较多,可能是权限问题,还有你的文件夹路径指定有问题。
基于ChatGPT部分参考:
可以尝试修改代码中的 CURLOPT_URL 部分,将路径改为 "sftp://192.168.2.15:22/test02/folder/20230510/",然后将 CURLOPT_NOBODY 改为 CURLOPT_UPLOAD。
修改后的代码如下:
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if (curl)
{
struct curl_slist *headerlist = NULL;
curl_easy_setopt(curl, CURLOPT_URL, "sftp://192.168.2.15:22/test02/folder/20230510/");
curl_easy_setopt(curl, CURLOPT_USERPWD, "sftpuser:123");
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
headerlist = curl_slist_append(headerlist, "MKDIR filepermissions=0755");
curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
res = curl_easy_perform(curl);
curl_slist_free_all(headerlist);
curl_easy_cleanup(curl);
if (CURLE_OK != res)
{
fprintf(stderr, "curl told us %d\n", res);
}
}
curl_global_cleanup();
这里将 MKDIR 命令添加到 headerlist 中,同时设置 filepermissions 为 0755,表示新建的文件夹权限是 rwxr-xr-x。
如果还有问题,可以尝试将 CURLOPT_VERBOSE 设为 1,输出详细的调试信息,以便查找问题所在。
以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
在使用libcurl进行sftp操作时,新建文件夹可以通过发送相应的sftp命令来实现。具体操作如下:
设置CURLOPT_UPLOAD选项为1,表示上传操作。同时设置CURLOPT_READFUNCTION选项,指定读取数据的回调函数,这里我们可以将其设置为NULL,表示不需要读取数据。
设置CURLOPT_QUOTE选项,添加需要执行的sftp命令。这里我们可以通过添加"mkdir 文件夹路径"来新建文件夹。
执行curl_easy_perform函数,发送请求,并接收响应。如果返回值不为CURLE_OK,则表示请求失败。
释放相关资源。
下面是具体的代码实现:
#include <stdio.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLcode res;
struct curl_slist *headerlist = NULL;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl)
{
/* Set sftp server url and credentials */
curl_easy_setopt(curl, CURLOPT_URL, "sftp://192.168.2.15:22/test02/folder");
curl_easy_setopt(curl, CURLOPT_USERPWD, "sftpuser:123");
/* Set upload option and read function */
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
/* Set sftp command to create folder */
headerlist = curl_slist_append(headerlist, "mkdir /test02/folder/20230510");
curl_easy_setopt(curl, CURLOPT_QUOTE, headerlist);
/* Execute the request */
res = curl_easy_perform(curl);
if(res != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
/* Free resources */
curl_slist_free_all(headerlist);
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
需要注意的是,sftp服务器的权限设置可能会影响新建文件夹的操作。如果新建文件夹失败,可以尝试修改sftp服务器的权限设置,并重试操作。