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*