libssh C++封装之六(Dir)

1 概述

  libssh是一个在客户端和服务器端实现SSHv2协议的多平台C库。使用libssh,您可以远程执行程序、传输文件、使用安全透明的隧道、管理公钥等等。本文描述的对libssh客户端功能的C++封装。
libssh下载地址

3 实现

3.5 Dir

Dir类型管理远程路径,通过SFTP和Channel实现(有的服务端不支持SFtp).
类图

3.5.1 Dir定义

3.5.1.1 Dir
class DirPrivate;
class SFtp;
class Scp;
class FileInfoPtr;
class FileInfos;
class Dir
{
   
public:
    enum Filter {
   
        Dirs        = 0x001,
        Files       = 0x002,
        Drives      = 0x004,
        NoSymLinks  = 0x008,
        AllEntries  = Dirs | Files | Drives,
        TypeMask    = 0x00f,

        Readable    = 0x010,
        Writable    = 0x020,
        Executable  = 0x040,
        PermissionMask    = 0x070,

        Modified    = 0x080,
        Hidden      = 0x100,
        System      = 0x200,
        AccessMask  = 0x3F0,

        AllDirs       = 0x400,
        CaseSensitive = 0x800,
        NoDot         = 0x2000,
        NoDotDot      = 0x4000,
        NoDotAndDotDot = NoDot | NoDotDot,
        NoFilter = -1
    };

    enum SortFlag {
    Name        = 0x00,
                    Time        = 0x01,
                    Size        = 0x02,
                    Type        = 0x03,
                    Property    = 0x04,
                    Unsorted    = 0x07,
                    SortByMask  = 0x07,

                    DirsFirst   = 0x08,
                    Reversed    = 0x10,
                    IgnoreCase  = 0x20,
                    DirsLast    = 0x40,
                    LocaleAware = 0x80,
                    NoSort = -1
    };

    Dir(SFtp const& sftp, const char* path);
    Dir(Scp const& scp, const char* path);
    ~Dir();

    bool is_root() const;
    const char* dirname() const;
    FileInfos fileinfos(Filter filter = NoFilter, SortFlag sortFlag = NoSort);

    bool mkdir(const char* path);
    bool rmdir(const char* path);
    bool mkfile(const char* filename);
    bool rmfile(const char* filename);
    bool rename(const char *original, const  char *newname);
    bool chmod(const char* filename, uint16_t mode);
    static std::string dirname(const char* filename);
    static std::string basename(const char* filename);
private:
    void sort(FileInfos &fileInfos, SortFlag sortFlag);
    Dir(Dir const&);
    Dir & operator == (Dir const&);

    DirPrivate* d;
};

接口函数:

  • is_root 是否root目录
  • dirname 返回路径名称
  • fileinfos 返回该目录文件列表
  • mkdir 创建目录
  • rmdir 删除目录
  • mkfile 创建文件
  • rmfile 删除文件
  • rename 文件目录改名
  • chmod 修改文件权限
  • dirname 获取文件目录名
  • basename 获取文件基本名称
3.5.1.2 DirPrivate
class DirPrivate
{
   
public:
    DirPrivate(const char * p)
        : path(p)
    {
   }

    virtual ~DirPrivate() {
   }

    virtual bool opendir() = 0;
    virtual sftp_attributes readdir() = 0;
    virtual void closedir() = 0;

    virtual bool mkdir(const char* path) = 0;
    virtual bool rmdir(const char* path) = 0;
    virtual bool mkfile(const char* filename) = 0;
    virtual bool rmfile(const char* filename) = 0;
    virtual bool rename(const char *original, const  char *newname) = 0;
    virtual bool chmod(const char* filename, uint16_t mode) = 0;

    bool is_relative_path(const char * path);
    inline bool is_empty(const char * path) {
    return !path || *path == 0; }
    inline std::string absolute_path(const char * p) {
    return path + "/" + p; }
    std::string path;
};

接口定义:

  • opendir 打开目录开始遍历
  • readdir 读取目录信息
  • closedir 关闭目录遍历
  • mkdir 创建目录
  • rmdir 删除目录
  • mkfile 创建文件
  • rmfile 删除文件
  • rename 文件改名
  • chmod 修改文件权限
  • is_relative_path 判断路径是否是相对路径
  • is_empty 判断路径是否为空
  • absolute_path 返回绝对路径
3.5.1.3 SftpDirPrivate

基于SFTP协议实现DirPrivate接口

class SftpDirPrivate : public DirPrivate
{
   
public:
    SftpDirPrivate(const char * p, sftp_session s)
        : DirPrivate(p)
        , sftp(s)
        , dir(0)
    {
   }

    bool opendir() override;
    sftp_attributes readdir() override;
    void closedir() override;

    bool mkdir(const char* path) override;
    bool rmdir(const char* path) override;
    bool mkfile(const cha

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/611292.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java入门基础学习笔记14——数据类型转换

类型转换: 1、存在某种类型的变量赋值给另一种类型的变量; 2、存在不同类型的数据一起运算。 自动类型转换: 类型范围小的变量,可以直接赋值给类型范围大的变量。 byte类型赋值给int类型,就是自动类型转换。 pack…

20240503安装HEVC解码器播放H265格式的8K视频

20240503安装HEVC解码器播放H265格式的8K视频 2024/5/3 9:55 缘起:由于youtube支持8K视频了,想尝尝鲜! 主摄像头当然是选择SONY的【夜摄/弱光场景】,根据优选,小米(MI)13Ultra 最佳了。 在开始播…

什么是SOL链跟单机器人与阻击机器人?

SOL链作为一个快速增长的区块链生态系统,为各种应用程序提供了丰富的发展机会。在SOL链上,智能合约的应用已经开始蓬勃发展,其中包括了许多与加密货币交易相关的应用。在本文中,我们将介绍在SOL链上开发的阻击机器人(S…

编译适配纯鸿蒙系统的ijkplayer中的ffmpeg库

目前bilibili官方的ijkplayer播放器,是只适配Android和IOS系统的。而华为接下来即将发布纯harmony系统,是否有基于harmony系统的ijkplayer可以使用呢? 鸿蒙版ijkplayer播放器是哪个,如何使用,这个问题,大家…

JVM调优—减少FullGC

背景 最近负责了一个审批流程新项目,带领了几个小伙伴,哼哧哼哧的干了3个月左右,终于在三月底完美上线了,好消息是线上客户用的很丝滑,除了几个非常规的业务提单之外,几乎没有什么大的问题,但是…

mamba-ssm安装卡着不动

项目中用到Mamba的小伙伴,causal_conv1d和 mamba-ssm两个包,但是会卡在Building wheel for mamba-ssm (setup.py) : 为了探究卡在了building的哪一步,加入–verbose进行显示: pip install mamba-ssm --no-cache-dir -…

基于Springboot的微乐校园管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的微乐校园管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

C++ 抽象与封装

一 抽象 抽象实例:时钟 数据抽象: 具有表面当前时间的时、分、秒 行为抽象: 具有设置时间和显示时间两个最基本的功能。 抽象实例:人 数据抽象:姓名、年龄、性别等。 行为抽象: 生物属性:吃…

centos安装mysql-client

直接安装: yum install mysql-community-client报了错误No package mysql-community-client available. 原因:CentOS/RHEL系统默认的软件源中并不包含MySQL软件包,需要通过添加第三方存储库来获取MySQL相关软件 添加源 安装MySQL官方的Yum…

如何使用vue脚手架创建项目

前言 使用vue搭建项目的时候,我们可以通过对应的cmd命令去打开脚手架,然后自己配置对应的功能插件 说明: 要使用Vue脚手架创建项目,你需要先确保你已经安装了Node.js和npm(Node.js的包管理器)。然后&#…

【数据结构与算法】常见的排序算法

文章目录 排序的概念冒泡排序(Bubble Sort)插入排序(Insert Sort)选择排序(Select Sort)希尔排序(Shell Sort)写法一写法二 快速排序(Quick Sort)hoare版本&a…

kaldi学习参考

HMM模型 https://www.cnblogs.com/baixf-xyz/p/16777438.htmlhttps://www.cnblogs.com/baixf-xyz/p/16777438.htmlGMM-HMM 基于GMM-HMM的语音识别系统https://www.cnblogs.com/baixf-xyz/p/16777439.html https://www.cnblogs.com/baixf-xyz/p/16777426.htmlhttps://www.cnbl…

Java入门基础学习笔记13——数据类型

数据类型的分类: 基本数据类型 引用数据类型 基本数据类型:4大类8种类型: 定义整形用int,再大的数用long。 package cn.ensource.variable;public class VariableDemo2 {public static void main(String[] args) {//目标&#x…

Python学习笔记------json

json简介 JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据 JSON本质上是一个带有特定格式的字符串 主要功能:json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互 为了让不同的语言能够相互通…

luceda ipkiss教程 69:导出器件或者线路的三维模型

ipkiss 3.12版加入write_obj函数,可以直接输出器件的三维模型。 如,输出自定义的mmi的三维模型: 代码如下: from si_fab import all as pdk from ipkiss3 import all as i3class MMI1x2(i3.PCell):"""MMI with …

【C++】学习笔记——优先级队列

文章目录 十、优先级队列1. priority_queue的介绍2. 优先级队列如何使小的数据优先级高3. 仿函数介绍4. priority_queue的模拟实现 补: 反向迭代器未完待续 十、优先级队列 1. priority_queue的介绍 优先级队列 其实也不属于队列,它跟 stack 和 queue …

【MQTT】mosquitto 的 “下载、交叉编译、使用” 详细教程,手把手搭建一个MQTT Broker

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

ARIMA模型在河流水质预测中的应用_含代码

#水质模型 #时间序列 #python应用 ARIMA 时间序列模型简介 时间序列是研究数据随时间变化而变化的一种算法,是一种预测性分析算法。它的基本出发点就是事物发展都有连续性,按照它本身固有的规律进行。ARIMA(p,d,q)模型全称为差分自回归移动平均模型 (A…

单链表经典oj题(2)

前言 这次将要把剩下的oj题将以图解和自己的理解把它讲解完,希望对大家有所帮助,这次的讲解也是干货 第一题 21. 合并两个有序链表 - 力扣(LeetCode) ok这次就简单点,大家自己去看题目了 将两个升序链表合并为一个…