libcurl sftp 新建文件夹失败

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命令来实现。具体操作如下:

  1. 设置CURLOPT_UPLOAD选项为1,表示上传操作。同时设置CURLOPT_READFUNCTION选项,指定读取数据的回调函数,这里我们可以将其设置为NULL,表示不需要读取数据。

  2. 设置CURLOPT_QUOTE选项,添加需要执行的sftp命令。这里我们可以通过添加"mkdir 文件夹路径"来新建文件夹。

  3. 执行curl_easy_perform函数,发送请求,并接收响应。如果返回值不为CURLE_OK,则表示请求失败。

  4. 释放相关资源。

下面是具体的代码实现:

#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服务器的权限设置,并重试操作。