linux——3.文件操作

/*
 *       file.cpp: for linux file methods
 */

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

#include <unistd.h>

#include <stdio.h>

#include <dirent.h>

#include <iostream>
using namespace std;

#define UNIT_TEST   1

// file class
class File
{
public:
    File()
    {
        m_fd = -1;
    }
    ~File()
    {
        close();
    }

    /*
    *       system lib call
    */
    // open
    // oflags: O_RDONLY, O_WRONLY, O_RDWR; O_APPEND, O_TRUNC, O_CREAT, O_EXCL
    // mode: S_IRUSR, S_IWUSR, S_IXUSR..
    bool open(const char *path, int oflags = O_RDWR, int mode = S_IRUSR | S_IWUSR)
    {
        m_fd = ::open(path, oflags, mode);
        return m_fd != -1;
    }

    // close
    void close()
    {
        if (m_fd != -1)
        {
            ::close(m_fd);
            m_fd = -1;
        }
    }

    // write
    size_t write(const void *buf, size_t nbytes)
    {
        if (m_fd != -1)
        {
            return ::write(m_fd, buf, nbytes);
        }

        return -1;
    }

    // read
    size_t read(void *buf, size_t nbytes)
    {
        if (m_fd != -1)
        {
            return ::read(m_fd, buf, nbytes);
        }

        return -1;
    }

    // copy
    static bool copy(const char *path, const char *pathout)
    {
        File in;
        if (!in.open(path, O_RDONLY))
        {
            return false;
        }

        File out;
        if (!out.open(pathout, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR))
        {
            return false;
        }

        char buf[1024];
        int nread;
        while ((nread = in.read(buf, sizeof(buf))) > 0)
        {
            out.write(buf, nread);
        }

        return true;
    }

    // seek
    off_t lseek(off_t offset, int whence = SEEK_SET)
    {
        if (m_fd != -1)
        {
            return ::lseek(m_fd, offset, whence);
        }
        return -1;
    }

    /*
     *       std io lib
     */
    // fopen, fclose, fread, fwrite, fflush, fsee,, fgetc, fputc, fprintf..

    /*
     *      maintain file and folder
     */
    // change file or folder access priority
    static int chmod(const char *path, mode_t mode)
    {
        return ::chmod(path, mode);
    }

protected:
    int     m_fd;
};

// directory
class Directory
{
public:
    Directory()
    {
        m_dir = NULL;
    }
    ~Directory()
    {
        close();
    }

    // make dir
    static int mkdir(const char *path, mode_t mode)
    {
        return ::mkdir(path, mode);
    }

    // remove dir
    // only if the dir is empty
    static int rmdir(const char *path)
    {
        return ::rmdir(path);
    }

    // change dir
    static int chdir(const char *path)
    {
        return ::chdir(path);
    }

    // get current work directory
    static char *getcwd(char *buf, size_t size)
    {
        return ::getcwd(buf, size);
    }

    // open dir
    bool open(const char *name)
    {
        m_dir = ::opendir(name);
        return m_dir != NULL;
    }

    // read dir
    // dirent: d_ino inode num, d_name file name
    dirent* read(DIR *dir = NULL)
    {
        if (!dir)
            dir = m_dir;
        if (dir)
            return readdir(dir);

        return NULL;
    }

    void close()
    {
        if (m_dir)
        {
            closedir(m_dir);
            m_dir = NULL;
        }
    }

    long int tell(DIR *dir = NULL)
    {
        if (!dir)
            dir = m_dir;
        if (dir)
            return telldir(dir);

        return -1;
    }

    void seek(DIR *dir = NULL, long int loc = 0)
    {
        if (!dir)
            dir = m_dir;
        if (dir)
            seekdir(dir, loc);
    }

    // scan
    static void scan(const char *path)
    {
        // open dir
        Directory dir;
        if (!dir.open(path))
        {
            cout << "open dir failed:" << path << endl;
            return;
        }

        // change dir
        chdir(path);

        // scan dir
        struct dirent *entry;
        struct stat statbuf;
        while ((entry = dir.read()) != NULL)
        {
            lstat(entry->d_name, &statbuf);
            if (S_ISDIR(statbuf.st_mode))
            {
                // found a dir, but ignore . and ..
                if (!strcmp(".", entry->d_name)
                    || !strcmp("..", entry->d_name))
                {
                    continue;
                }
                scan(entry->d_name);
            }
            else
            {
                cout << entry->d_name << endl;
            }
        }

        chdir("..");
        dir.close();
    }
protected:
    DIR*    m_dir;
};

#if UNIT_TEST == 1
int main()
{
    File file;

    // create open.txt
    if (!file.open("open.txt", O_RDWR | O_CREAT))
    {
        cout << "create file open.txt error.\n";
    }
    else
    {
        // write
        char buf[] = "this is adfan\nit's true\n";
        file.write(buf, sizeof(buf));

        file.close();
    }

    // open
    if (!file.open("open.txt"))
    {
        cout << "open file open.txt error.\n";
    }
    else
    {
        char buf[256] = {0};
        file.read(buf, 256);
        cout << buf << endl;
    }

    // close file
    file.close();

    // copy
    File::copy("open.txt", "open_out.txt");

    char dir[256];
    cout << Directory::getcwd(dir, 256) << endl;

    // scan
    Directory::scan(dir);
}
#endif

时间: 2024-10-07 04:48:18

linux——3.文件操作的相关文章

qt ui程序使用Linux的文件操作open、close (转)

原文地址:qt ui程序使用Linux的文件操作open.close 作者:kjpioo 提出这个问题是因为在qt的QWidget类型的对象中,close()函数会和QWidget::close()冲突,如果在类函数实现时直接用close(),在程序编译时会提示提示错误(具体什么错误不记得了). 错误原因是QWidget::close()与stdio.h中的文件关闭标准函数close()产生了歧义.所以可以参考下文链接中的解决方案. http://bytes.com/topic/c/answer

Linux C 文件操作 -- 系统调用(open(),read()...) 和 标准I/O库(fopen(),fread()...)

一.什么是文件 在讲述文件操作之前,我们首先要知道什么是文件.看到这个问题你可能会感觉到可笑,因为对于用过计算机的人来说,文件是最简单不过的概念了,例如一个文本是一个文件,一个work文档是一个文件等.但是在Linux中,文件的概念还远不止于这些,在Linux中,一切(或几乎一切)都是文件.文件包括很多的内容,例如:大家知道的普通文件是文件,目录也是一个文件,设备也是一个文件,管道也是一个文件等等.对于目录.设备这些的操作也可以完全等同于对纯文本文件的操作,这也是Linux非常成功的特性之一吧.

linux程序设计——文件操作(第三章)

第三章    文件操作 3.1 linux文件结构 与UNIX一样,linux环境中的文件具有特别重要的意义,因为它们为操作系统服务和设备提供了一个简单而一致的接口.在linux中,一切都是文件. 这意味着,通常程序可以像使用文件那样使用磁盘文件.串行口.打印机等等. 目录也是文件,但它是一种特殊类型的文件.在现代UNIX(包括linux)版本中,即使是超级用户可能也不再被允许直接对目录进行写左操作了.所有用户通常都使用上层的opendir/readdir接口来读取目录,而无需了解特定系统中目录

【大话QT之五】Windows与Linux下文件操作监控的实现

一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场上网盘实现有一些的不同,主要在客户端与服务器端的操作需要双向进行,即:用户在客户端的操作需要及时同步到服务器端:在服务器端作业渲染生成的文件要及时同步到客户端.即:用户不在需要单独的下载数据,而是在作业运行的同时,渲染就过就会自动同步到客户端,大大缩短了等待时间.当然,无论是在客户端还是在服务端都面

【Linux】文件操作系统调用

一. 文件描述符 在Linux下使用文件描述符来表示设备文件和普通文件.文件描述符是一个整型的数据,所有对文件的操作都通过文件描述符实现.文件描述符的范围是0~OPEN_MAX,系统中有3个已经分配的文件描述符,即标准输入.标准输出.和标准错误,他们的文件描述符的值分别为0.1.2. 文件描述符是文件系统中连接用户空间和内核空间的枢纽.当打开一个或者创建一个文件时,内核空间创建相应的结构,并生成一个整型的变量传递给用户空间的对应进程,进程用这个文件描述符来对文件进行操作. 二. 打开.创建文件o

Windows与Linux下文件操作监控的实现

一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场上网盘实现有一些的不同,主要在客户端与服务器端的操作需要双向进行,即:用户在客户端的操作需要及时同步到服务器端:在服务器端作业渲染生成的文件要及时同步到客户端.即:用户不在需要单独的下载数据,而是在作业运行的同时,渲染就过就会自动同步到客户端,大大缩短了等待时间.当然,无论是在客户端还是在服务端都面

linux编程---文件操作

文件操作的系统函数: open函数,close函数,read函数,write函数,getcwd函数,access函数,stat函数,fstat函数,getcwd函数 函数原型: 1:open函数 功能:打开现有的文件,或者创建新文件并打开:,成功返回值是文件标识号,失败为-1 参数:parhname是文件路径,flag标识可取如下值 mode表示文件访问权限 2:close函数 功能:关闭文件操作,返回值表示是否成功 参数:文件标识号 3:read函数 功能:读取文件内容,返回值表示实际读取内容

linux之文件操作和权限

文件查看 cat显示文本 cat [option] ... [file] ... cat -E a.txt # 显示$符号 cat -n a.txt # 对显示的每一行加行号 cat -b a.txt # 对非空行进行编号 cat -s a.txt # 对连续的空行就行压缩 tac倒叙显示 less分屏显示文本或stdin输出 space空格 # 向下翻屏 enter # 向下翻一行 q # 退出 /文本 # 搜索,搜索结果高亮显示 n # 向下找到 N # 向上查找 less是man命令的默认

Linux学习-文件操作

文件操作 pwd 显示当前的目录名称 cd 更改当前的操作目录 cd /path/to/...绝对路径 cd ./path/to/..相对路径 cd ../path/to/..相对路径 cd /root 回到根目录 cd - 返回上一次的目录中 cd ./ .表示当前的目录 cd .. 回到上一级目录 / 和 /root 是不同的目录 / 是根目录 /root 是root用户的家目录 ls 查看当前目录下的文件 常用参数 l 长格式显示文件,以文件名进行排序 a 显示隐藏文件 r 逆序显示,以文

Windows、Linux下文件操作(写、删除)错误的产生原因、及解决方法

catalog 0. 引言 1. Linux平台上涉及的File IO操作 2. Windows平台上涉及的File IO操作 0. 引言 本文试图讨论在windows.linux操作系统上基于C库进行文件IO操作时,可能遇到的错误,及其解决方法,主机安全攻防产品除了需要将安全攻防上的领域知识固化到程序实现上之外,还极度依赖关联系统本身.编程语言库的特性,原则上,并不是所有的安全需求都能100%地落实到程序设计中,这需要我们对操作系统.编程语言本身具有较深的理解 Relevant Link: h