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参数控制缩进格式。