《linux程序设计学习笔记》之一---文件和目录的维护

linux提供了一些系统调用和标准库,使得文件和目录的创建与维护提供了全面的支持。

1.chmod系统调用

#include<sys/stat.h>

int chmod(const char *path,mode_t mode);

chmod系统调用构成了shell程序chmod命令的基础,我们可以用它来改变文件或目录的访问权限。

path参数指定文件,mode给出修改后的访问权限。


2.chown系统调用

#include<sys/stat.h>

#include<unistd.h>

int chown(const char *path,uid_t owner ,gid_t group);

shell程序chown命令给基于此系统调用。超级用户可以使用chown系统调用来改变一个文件的属主。

参数owner和group分别使用的是用户id和组id的值(可通过getuid和getgid调用获得)。


3.mkdir和rmdir

#include<sys/types.h>

#include<sys/stat.h>

int mkdir(const char *path,mode_t mode);

mkdir系统调用用于创建目录,它相当于mkdir程序。

i#include<unistd.h>

int rmdir(const char *path);

rmdir系统调用用于删除目录(目录必须为空时才行)。rmdir程序基于rmdir系统调用。


4.chdir和getcwd

#include<ubistd.h>

int chdir(const char *path);

我们可以使用chdir系统调用切换目录,就想在shell中使用cd命令一样。

#include<unistd.h>

char *getcwd(char *buf ,size_t size);

类似于pwd命令,getcwd系统调用把当前目录的名字写到缓冲区buf中并返回。若目录名长度超过了size,它会返回null。


与目录扫描相关的标准函数库的使用:

#include<sys/types.h>

#include<dirent.h>


DIR *opendir(const char *name);  打开目录建立目录流

struct dirent  *readdir(DIR *dirp);  扫描目录,返回目录信息

long int telldir(DIR *dirp);  返回目录流的当前位置

void seekdir(DIR *dirp,long int loc);  设置目流dirp的目录项指针

int closedir(DIR *dirp);  关闭一个目录流并释放相关的资源

下面是一个目录扫描的程序printdir.cpp:

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


void printdir(char *dir,int depth)
{
    DIR *dp;
    struct dirent *entry;
    struct stat statbuf;
    if((dp = opendir(dir)) == NULL)
    {
        fprintf(stderr,"cannot open directory : %s\n",dir);
        return;
    }
    chdir(dir);
    while((entry = readdir(dp)) != NULL) {
        lstat(entry->d_name,&statbuf);
        if(S_ISDIR(statbuf.st_mode)){
            if (strcmp(".",entry->d_name) == 0 ||
                strcmp("..",entry->d_name) == 0)
                continue;
            printf("%*s%s/\n",depth,"",entry->d_name);
            printdir(entry->d_name,depth+4);
            }


        else printf("%*s%s\n",depth,"",entry->d_name);
    }
    chdir("..");
    closedir(dp);
}

int main(int argc,char* argv[])
{
    if (argc > 2)
        printf("an error occurred because argc >2 \n");


    printf("Directory scan of %s:\n",argv[1]);
    printdir(argv[1],0);
    printf("done.\n");


    return 0;
}

运行./printdir  /usl/local 

Directory scan of /usr/local:
lib/
src/
lib64/
sbin/
etc/
games/
bin/
    db2ls
libexec/
share/
    applications/
        mimeinfo.cache
    info/
    man/
        man4x/
        man8/
        man5x/
        man4/
        man7/
        man9x/
        man1/
        man5/
        man2/
        man8x/
        man6x/
        mann/
        man2x/
        man9/
        man7x/
        man3x/
        man6/
        man1x/
        man3/
include/
done.

此程序综合使用了几种系统调用和目录操作函数,它的作用是输出当前目录的内容(递归遍历各级子目录),depth参数控制缩进格式。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值