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\n");break;
        case S_IFDIR: puts("directory\n");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>\n");
        return 1;
    }
    if((dp=opendir(argv[1])) == NULL){
        printf("OPen dir %s failed.\n", argv[1]);
        return 2;
    }
    while((pdirent=readdir(dp)) != 0){
        printf("%s\n", 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\n", depth, "", direntPointer->d_name);
            scan_dir(direntPointer->d_name, depth+4);
        }else{
            printf("%*s%s\n", depth, "", direntPointer->d_name);
            //puts(direntPointer->d_name);
        }
    }
    chdir("..");

    closedir(dp);
}

int main(){
    puts("/home directory is \n");
    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.");
    }

}

posted @ 2013-07-11 14:19  wangle100  阅读(832)  评论(0编辑  收藏  举报