mycsdn12306 2023-05-12 00:06 采纳率: 100%
浏览 114
已结题

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();
}
  • 写回答

5条回答 默认 最新

  • Leodong. 2023-05-12 10:43
    关注

    该回答通过自己思路及引用到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;
    }
    

    此代码应该能够成功创建文件夹。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月20日
  • 已采纳回答 5月12日
  • 创建了问题 5月12日

悬赏问题

  • ¥15 远程访问linux主机超时
  • ¥15 odoo17存货管理优势于中国国内该行业传统ERP或MES的详细解读和举例
  • ¥15 CPU卡指令整合指令数据都在图片上
  • ¥15 火车票关联12306问题
  • ¥15 odoo17处理受托加工产品
  • ¥15 如何用MATLAB编码图三的积分
  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES
  • ¥15 结构功能耦合指标计算