Linux C/C++编程:对文件操作的封装

2023-11-20

源码

//
// Created by oceanstar on 2021/8/9.
//

#ifndef OCEANSTAR_HTTP_ACL_FILE_H
#define OCEANSTAR_HTTP_ACL_FILE_H

#include <global.h>
#include "acl_vstream.h"

#define  acl_off_t long long int
# define	ACL_FILE_HANDLE		int
namespace oceanstar{

    class acl_file{
    private:
        ACL_FILE_HANDLE file_handle_;
        explicit acl_file(ACL_FILE_HANDLE file_handle){
            file_handle_ = file_handle;
        }
    public:


        /**
          * 打开文件句柄
          * @param filepath {cosnt char*} 文件路径
          * @param flags {int} 打开标志位, O_RDONLY | O_WRONLY | O_RDWR,
          *  O_CREAT | O_EXCL | O_TRUNC, O_APPEND(for UNIX)
          * @param mode {int} 打开权限位, 仅对UNIX有效, 如:0700, 0755
          * @return {ACL_FILE_HANDLE} 打开的文件句柄,返回 ACL_FILE_INVALID 表示打开失败
          */
        static acl_file* acl_file_open(const char *filepath, int flags, int mode);
        /**
         * 关闭打开的文件句柄
         * @return {int} 0: ok; -1: error
         */
         int acl_file_close();
        /**
        * 定位文件位置
        * @param fh {ACL_FILE_HANDLE} 文件句柄
        * @param offset {acl_off_t} 偏移位置
        * @param whence {int} 位置标志位:SEEK_CUR, SEEK_SET, SEEK_END
        * @return {acl_off_t} 当前的文件偏移位置
        */
         acl_off_t acl_lseek(acl_off_t offset, int whence);
        /**
        * 从文件中读数据
        * @param fh {ACL_FILE_HANDLE} 文件句柄
        * @param buf {void*} 存储缓冲区
        * @param size {size_t} buf 缓冲区大小
        * @param timeout {int} 读超时时间(秒)
        * @param fp {ACL_VSTREAM*} 对应的文件流句柄, 可以为空
        * @param arg {void*} 用户传递的参数, 以回调方式使用时此参数有效
        * @return {int} 读到的实际数据, 如果返回 ACL_VSTREAM_EOF 表示读结束或出错
        */
         int acl_file_read(void *buf, size_t size,
                                  int timeout, ACL_VSTREAM *fp, void *arg);
        /**
        * 向文件中写数据
        * @param fh {ACL_FILE_HANDLE} 文件句柄
        * @param buf {void*} 数据存储缓冲区
        * @param size {size_t} buf 缓冲区中数据长度大小
        * @return {int} 成功写的数据量, 如果返回 ACL_VSTREAM_EOF 表示写出错
        */
         int acl_file_write(const void *buf, size_t size);

         int acl_file_lseek_begin(){
             return lseek(file_handle_, 0, SEEK_SET);
         }

        /**
         * 向文件中写一组数据
         * @param fh {ACL_FILE_HANDLE} 文件句柄
         * @param vec {const struct iovec*} 数据存储数组
         * @param count {int} vec 数组中元素个数
         * @return {int} 成功写的数据量, 如果返回 ACL_VSTREAM_EOF 表示写出错
         */
        int acl_file_writev(const struct iovec *vec, int count);
        /**
         * 将文件缓冲区中的数据全部写入硬盘
         * @return {int} 0: ok; -1: error
         */
         int acl_file_fflush();
        /**
        * 根据文件名取得该文件的大小
        * @param filename {const char*} 文件名
        * @return {acl_int64} >= 0: ok;  -1: error
        */
         acl_int64 acl_file_size(const char *filename);
        /**
        * 根据文件句柄取得该文件的大小
        * @return {acl_int64} >= 0: ok;  -1: error
        */
         acl_int64 acl_file_fsize();
    };
}
#endif //OCEANSTAR_HTTP_ACL_FILE_H

//
// Created by oceanstar on 2021/8/9.
//
#include <fcntl.h>
#include <unistd.h>
#include "acl_file.h"
#include<sys/stat.h>


namespace oceanstar{
    /**
     * 打开文件句柄
     * @param filepath {cosnt char*} 文件路径
     * @param flags {int} 打开标志位, O_RDONLY | O_WRONLY | O_RDWR,
     *  O_CREAT | O_EXCL | O_TRUNC, O_APPEND(for UNIX)
     * @param mode {int} 打开权限位, 仅对UNIX有效, 如:0700, 0755
     * @return {acl_file *} 打开的文件句柄,返回 null 表示打开失败
     */
    acl_file* acl_file::acl_file_open(const char *filepath, int flags, int mode){
        const char *myname = "acl_file_open";
        ACL_FILE_HANDLE handle =  open(filepath, flags, mode);
        if(handle == -1){
            logger_error("%s, %s(%d): open file(%s) error(%s)",
                          myname, __FILE__, __LINE__,
                          filepath, strerror(errno));
            return nullptr;
        }

        return new acl_file(handle);
    }

    int  acl_file::acl_file_close(){
        int ret = close(file_handle_);
        delete this;
        return ret;
    }

    acl_off_t acl_file::acl_lseek(acl_off_t offset, int whence){
        return lseek64(file_handle_, offset, whence);
    }

    int acl_file::acl_file_read(void *buf, size_t size,
                                int timeout, ACL_VSTREAM *fp, void *arg){
        if (fp != NULL && fp->get_read_ready()) {
            fp->set_read_ready(0);
        }
        return (int) read(file_handle_, buf, size);
    }

    int acl_file::acl_file_write(const void *buf, size_t size){
        return (int) write(file_handle_, buf, size);
    }

    int acl_file::acl_file_writev(const struct iovec *vec,
                        int count){
        return (int) writev(file_handle_, vec, count);
    }

    int acl_file::acl_file_fflush(){
        return fsync(file_handle_);
    }

    /**
        * 根据文件名取得该文件的大小
        * @param filename {const char*} 文件名
        * @return {acl_int64} >= 0: ok;  -1: error
        */
    acl_int64 acl_file::acl_file_size(const char *filename){
        struct stat sbuf;

        if (stat(filename, &sbuf) == -1) {
            return -1;
        }
        return sbuf.st_size;
    }

        /**
        * 根据文件句柄取得该文件的大小
        * @return {acl_int64} >= 0: ok;  -1: error
        */
     acl_int64 acl_file::acl_file_fsize(){
        struct stat sbuf;

        if (fstat(file_handle_, &sbuf) == -1) {
            return -1;
        }
        return sbuf.st_size;
    }
}



测试

#include "acl_file.h"

int main(void){
    oceanstar::acl_file * fh = oceanstar::acl_file::acl_file_open("text.txt",  O_CREAT | O_RDWR | O_APPEND, 0755);
    if(fh == NULL){
        printf("open text.txt error [%s]\n", strerror(errno));
        exit(0);
    }

    printf("file_size = %lld\n", fh->acl_file_fsize());

    int ret ;
    char  buf[1024];
    memset(buf, 0, strlen(buf));
    sprintf(buf, "hello client");
    ret = fh->acl_file_write(buf, strlen(buf));
    if(ret == ACL_VSTREAM_EOF){
        printf("write to file error [%s]\n", strerror(errno));
        fh->acl_file_close();
        exit(0);
    }
    printf("write to file ok [%d]\n", ret);

    memset(buf, 0, strlen(buf));

    //记住,这里一定要重新打开或者lseek到开头,否则读不到数据【因为当前文件指针已经定位到了最末尾】
    fh->acl_file_lseek_begin();

    int ret1 = fh->acl_file_read(buf, sizeof(buf), 0, NULL, 0);
    if (ret1 == ACL_VSTREAM_EOF) {
        printf("read to file error [%s]\n", strerror(errno));
        fh->acl_file_close();
        exit(0);
    }
    buf[ret1] = 0;
    printf("acl_file_read = [%d: %s]\n",  ret1, buf);

    fh->acl_file_close();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux C/C++编程:对文件操作的封装 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • Python爬虫入门——梦开始的地方

    目录 文章目录 前言 一 前置知识 二 实现步骤 1 分析网站 2 制定爬取方案 3 实现方案 4 基础代码展示 5 代码详解 6 代码封装 总结 前言 爬虫应严格遵守国家法律规定 时隔数月 进入暑假 回忆这数月的学习内容 不禁感慨计算机的
  • jpa insert 对象_SpringBoot2.x入门:使用JPA

    前提 这篇文章是 SpringBoot2 x入门 专辑的 第9篇 文章 使用的SpringBoot版本为2 3 1 RELEASE JDK版本为1 8 这篇文章会介绍一下SpringBoot如何引入和使用JPA JPA 即Java Pers
  • 表示不变量

    不变量 产生好的ADT设计 其中最重要的一点就是它会保护 保留自己的不变量 不变量是一种属性 它在程序运行的时候总是一种状态 而不变性就是其中的一种 一旦一个不变类型的对象被创建 它总是代表一个不变的值 当一个ADT能够确保它内部的不变量恒
  • Java内存模型

    Java内存模型 处理器需要与内存交互 如读取运算数据 存储运算结果等 这个I O操作是很难消除的 无法仅靠寄存器来完成所有运算任务 由于计算机的存储设备与处理器的运算速度有几个数量级的差距 所以现代计算机系统都不得不加入一层读写速度尽可能
  • GitHub上传新手

    第一次上传 1 注册GitHub 2 新建仓库 网上有新建教程 很简单的 3 下载安装Git 一般一直下一步即可 没有特殊要求的话 网址 https gitforwindows org 4 在Git Bush中进入放项目文件的地址 如果是直
  • CentOS7上安装anaconda3及其遇到的问题

    https mirrors tuna tsinghua edu cn anaconda archive 国内镜像 下载速度快 不要选择最新版 有问题 建议 4 3 0 运行命令 conda V 返回版本号即安装成功 1 通过命令行工具 wg
  • 必须了解的mysql三大日志-binlog、redo log和undo log

    目录 一 前言 二 binlog 备份日志 1 作用 2 使用场景 3 日志形式 4 binlog刷盘时机 三 redo log 重做日志 1 概念 2 为什么需要redo log 3 日志形式 4 redo log与binlog区别 四
  • 锂电池基础知识简介

    锂离子电池已经渗透到现代生活的方方面面 它可以为生活中很多东西 如手机 手表 平板电脑 便携式设备等 提供电源 现简单概要介绍锂电池的基础知识 1 基础术语 1 C rate 倍率 指电池充放电时电流与电池标称容量的比率 即描述了电池可以在
  • FPGA Lattice Diamond 开发环境搭建

    FPGA Lattice Diamond 开发环境搭建 Lattice Diamond 软件下载 在浏览器中输入 Lattice 的官网地址 http www latticesemi com 进入官网首页在上方选择产品系列选项 出现如下图所
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙
  • 【源码篇】基于ssm+bootstrap+jquery的学生成绩管理系统

    系统介绍 基于ssm bootstrap jquery的学生成绩管理系统一共分为六大模块 分别是用户管理 课程管理 班级管理 学籍管理 学费管理 成绩管理 用户管理 1 用户信息预览 查询并根据姓名搜索系统用户 2 新增用户信息 添加系统用
  • Redis7之事务(五)

    五 Redis 事务 5 1 介绍 可以一次执行多个命令 本质是一组命令的集合 一个事务中的所有命令都会序列化 按顺序地串行化执行而不会被其他命令插入 不许加塞 一个队列中 一次性 顺序性 排他性的执行一系列命令 5 2 Redis事务和数
  • 包管理工具那么多,怎么选?npm、yarn 和 pnpm 三者比较及使用详解!

    1 简介 在 Vue 项目中 我们需要使用许多第三方依赖库 如 Vue Router Vuex Axios Element UI 等等 这些依赖库通常以 NPM 包的形式提供 而且在使用时需要进行版本管理 因此 我们需要使用一个包管理工具来
  • TCP/IP详解 第十二章(2) linux 网络编程

    转载请声明博主https mp csdn net console editor html 106517098 一 Linux网络概述 LINUX网络优势 1 完善的内置网络 和内核结合在一起的网络部分 I p queue 2 Linux 免
  • python将超大CSV文件切割为多个Excel文件存储

    很多时候处理数据会碰到CSV文件 如果是一般的少量文件问题不大 一旦碰到大型的CSV文件 就会出现打不开文件的结果 因为文本无法打开超大型文件 Excel也最多能够容量一百万条数据量 因此只能将CSV文件切割成为多个小的CSV文件 将csv
  • Swing之Jframe窗体、 JDialog弹窗、标签、面板、按钮(图片按钮,单选框,多选框)、列表(下拉框,列表框)、文本框、密码框

    Swing Jframe窗体 import javax swing import java awt public class JFrameDemo init 初始化 public void init JFrame frame new JFr
  • Vue 组件化

    什么是组件化 任何一个人处理信息的逻辑能力都是有限的 所以 当面对一个非常复杂的问题时 我们不太可能一次性搞定一大堆的内容 但是 我们人有一种天生的能力 就是将问题进行拆解 如果将一个复杂的问题 拆分成很多个可以处理的小问题 再将其放在整体
  • 每月的倒扣料

    这是一个生产领料的典型 倒扣法 即BOM配置的单位和发料单位不相同时 我们不可能通过转换而达到发料的方便 比较典型的物料有 电线 按米领料 发料时要按捆化工 按kg领料 发料时按桶等等 通常在实施的时候 先将一捆电线调拔到线边仓库 仓管操作
  • 利用人工智能技术普及教学应用、拓展教师研训应用、增强教育系统监测能力

    2019年 中国教育现代化2035 指出 以人才培养为核心 通过提升校园智能化水平 探索新型教学形式 创新教育服务业态 推进教育治理方式变革 智能驱动教育创新发展 2021年教育部等六部门发布 关于推进教育新型基础设施建设构建高质量教育支撑
  • Linux C/C++编程:对文件操作的封装

    Linux C C 编程 lseek fseek ftell rewind fgetpos fsetpos 源码 Created by oceanstar on 2021 8 9 ifndef OCEANSTAR HTTP ACL FILE