zoukankan      html  css  js  c++  java
  • LInux文件基础知识和文件目录操作(系统调用函数方式)

    1、进程是处于活动状态的程序,某个用户通过操作系统运行程序所产生的进程代表着该用户的行为。如果用户不具备访问某个目录和文件的权限,那么该用户的进程也不能访问。

    2、Linux系统中文件安全机制是通过给系统中的文件赋予两个属性来实现的,这两个属性分别是所有者属性和访问权限属性。Linux系统下的每一个文件必须严格地属于一个用户和一个组,针对不同的用户和组又具有不同的访问权限。

     

    3、系统调用是Linux内核提供的功能十分强大的一系列的函数。这些函数是在内核中实现的,他们是应用程序和内核交互的接口,如图所示。

    4、打开文件操作使用系统调用函数open(),该函数的作用是建立一个文件描述符,其他的函数可以通过文件描述符对指定文件进行读取与写入的操作。

         新建目录操作可使用函数mkdir()实现

         获得当前子目录的操作可使用函数getwd(),

         重新指定调用进程的当前工作目录 chdir(const char* pathname)

         删除目录操作可使用函数rmdir()完成,该函数的一般形式是:rmdir(路径),该函数必须是在该目录下没有子目录或文件的情况下才能运行。删除文件操作可使用函数unlink,该函数的一般形式是:unlink(路径);

        

         获取文件状态和属性操作可使用fstat()、lstat()和stat()这三个函数来操作。获取的stat结构中有以下属性可以使用:

        

    5、代码:

    (1)  FileHandler.c: file type and permission getter

    /*
     * FileOpenClose.c
     *
     *  Created on: Jul 9, 2013
     *      Author: root
     */
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>

    int main(){
        int f;
        const char* f_path="test";
        mode_t f_attrib;
        f_attrib = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
        struct stat *buf = malloc(sizeof(stat));
        f= open(f_path, O_RDONLY);
        if(f == -1){
            f = open(f_path, O_RDWR | O_CREAT, f_attrib);
            if(f != -1){
                puts("create a new file successfully");
            }else{
                puts("unble to create a file, program exit");
                return 1;
            }

        }else{
            puts("open test file successfully");
        }
        close(f);
        stat(f_path, buf);
        //file mode: user permission
        if(buf->st_mode & S_IRUSR){
            puts("user have read permission!");
        }
        if(buf->st_mode & S_IWOTH){
            puts("other users have write permission.!");
        }else{
            puts("other users don't have write permission.!");
        }
        //file mode: file type.
        switch(buf->st_mode & S_IFMT){
            case S_IFREG: puts("regular ");break;
            case S_IFDIR: puts("directory ");break;
            case S_IFCHR: puts("character special");break;
            case S_IFBLK: puts("block special");break;
            case S_IFSOCK:puts("socket");break;
            default:puts("unknown mode");
        }
        return 0;
    }

    (2) DirectoryHandler.c: open a directory and read its sub files.

    #include <sys/types.h>
    #include <dirent.h>
    #include <unistd.h>
    #include <stdio.h>
    int main(int argc, char * argv[]){
        char path[1000];
        DIR * dp;
        struct dirent * pdirent;
        if(argc != 2){
            printf("Usage ex3-9 <pathname> ");
            return 1;
        }
        if((dp=opendir(argv[1])) == NULL){
            printf("OPen dir %s failed. ", argv[1]);
            return 2;
        }
        while((pdirent=readdir(dp)) != 0){
            printf("%s ", pdirent->d_name);
        }
        closedir(dp);
        return 0;
    }

     (3) DirectoryHandler2.c:  scan  files in a directory

    #include <stdio.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <unistd.h>
    #include <string.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdlib.h>

    void scan_dir(char * pathname, int depth){
        DIR * dp;
        dp = opendir(pathname);
        if(dp == NULL){
            puts("directory open failed");
            return;
        }
        chdir(pathname);
        struct dirent * direntPointer;
        //struct stat * pstat = malloc(sizeof(stat));
        struct stat stat;
        while((direntPointer = readdir(dp)) != NULL){
            lstat(direntPointer->d_name, &stat);
            if((strcmp(".", direntPointer->d_name) == 0) ||
                    (strcmp("..", direntPointer->d_name) == 0)){
                continue;
            }
            if((strcmp("Debug", direntPointer->d_name) == 0)){
                puts("debug*********");
            }
            if((stat.st_mode & S_IFMT) == S_IFDIR){
                printf("%*s%s ", depth, "", direntPointer->d_name);
                scan_dir(direntPointer->d_name, depth+4);
            }else{
                printf("%*s%s ", depth, "", direntPointer->d_name);
                //puts(direntPointer->d_name);
            }
        }
        chdir("..");

        closedir(dp);
    }

    int main(){
        puts("/home directory is ");
        scan_dir("/home", 0);
        return 0;
    }

    (4) DirectoryHandler3.c: create directory and file, and delete file and directory. if the directory does'nt have any file, we can delete this directory.

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    int main(){
        mode_t mode;
        mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP;
        if(mkdir("testdir", mode) != -1){
            puts("create testdir directory successfully.");
        }
        chdir("./testdir");
        if(creat("testfile", mode) != -1){
            puts("create testfile file successfully.");
        }

        if(unlink("testfile") != -1){
            puts("delete testfile file successfully.");
        }
        chdir("..");
        if(rmdir("testdir") != -1){
            puts("delete testdir directory successfully.");
        }

    }

  • 相关阅读:
    Aruduino un0 spi oled官方代码
    排序--之快速排序
    用arduino UNO R3板为pro mini板烧录bootloaders
    数码管显示
    gdb高级功能与配置
    ROS中调试c++程序
    自引用结构--之创建双向遍历的链表
    数据文件——将从键盘设备文件读取文本将其写入显示器设备文件
    数据文件——将文本写入显示器设备文件
    ifcfg-eth0
  • 原文地址:https://www.cnblogs.com/wangle1001986/p/3183884.html
Copyright © 2011-2022 走看看