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 char*

相关推荐

  1. Python基础(二十封装、继承)

    2024-05-12 18:10:02       52 阅读
  2. MacOS、ubuntu安装libsshlibssh2

    2024-05-12 18:10:02       39 阅读
  3. Python基础日志封装

    2024-05-12 18:10:02       55 阅读
  4. FPGAzynq_DDR(1)

    2024-05-12 18:10:02       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-12 18:10:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-12 18:10:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-12 18:10:02       82 阅读
  4. Python语言-面向对象

    2024-05-12 18:10:02       91 阅读

热门阅读

  1. C++ 利用标准库多字节转宽字节字符

    2024-05-12 18:10:02       28 阅读
  2. LeetCode //C - 87. Scramble String

    2024-05-12 18:10:02       31 阅读
  3. 马尔可夫链 学习笔记

    2024-05-12 18:10:02       31 阅读
  4. timestamp和datetime的区别

    2024-05-12 18:10:02       31 阅读
  5. 若依前端分离版-APP(UNI APP)表单添加验证

    2024-05-12 18:10:02       28 阅读
  6. GDB 使用python

    2024-05-12 18:10:02       36 阅读
  7. sql中的lag()和lead()是什么意思

    2024-05-12 18:10:02       36 阅读