1 目录的维护
#include <sys/stat.h>
int chmod(const char* path,mode_t mode);
chmod用来改变文件或目录的访问权限,参数mode与open的相同。除非程序被赋予适当的特权,否则只有文件的属主或超级用户可以修改它的权限。
#include <sys/types.h>
#include <unistd.h>
int chown(const char* path,uid_t owner,gid_t group);
chown用用户ID和组ID修改文件属主的系统值。
#include <unistd.h>
int unlink(const char* path);
int link(const char* path1,const char* path2);
int symlink(const char* path1,const char* path2);
unlink用来删除一个文件的目录项并减少它的链接数,成功时返回0失败时返回-1,若想删除文件就必须拥有该文件所属目录的写和执行权限。若一个文件的链接数减少到零,且没有进程打开它,那么该文件就会被删除。rm程序就是使用这个系统调用。
link创建一个指向已有文件path1的新链接,新目录项由path2给出。
symlink创建符号链接,一个文件的符号链接不会增加该文件的链接数,类似于Windows中的快捷方式,它不会像普通链接那样防止文件被删除。由下图可以看到link是硬链接,类似于复制文件,而symlink是软链接,类似于创建快捷方式。
#include <sys/types.h>
#include <sys/stat.h>
int mkdir(const char* path,mode_t mode);
mkdir系统调用用于创建目录,权限由mode决定,含义根据O_CREAT选项中的有关定义进行设置
#include <unistd.h>
int rmdir(const char* path);
rmdir系统调用用于删除目录,但只有在目录为空时才可以。
#include <unistd.h>
int chdir(const char* path);
char* getcwd(char* buf,size_t size);
chdir函数使程序可以在文件系统中切换目录。
getcwd函数获取当前目录并写入buf中,目录名长度不能超过size,若失败返回NULL,成功时返回指针buf。
2 扫描目录
Linux与目录扫描操作相关的函数在<dirent.h>
头文件中声明,它利用被称为目录流的指针DIR*
用来完成各种目录操作,目录的有关数据在dirent
结构中返回。
#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);
int closedir(DIR* dirp);
opendir打开一个目录并建立一个目录流,返回的指向DIR结构的指针用于读取目录数据项。失败时返回一个空指针。目录流利用底层的文件描述符来访问目录的。
readdir返回一个指针,指向的结构里保存着目录流dirp中下一个目录项的有关资料。发生错误或到达文件尾时返回NULL。返回的结构中的成员如下
ino_t d_ino;//文件的inode节点号
char d_name[];//文件的名字
telldir函数返回目录流里的当前位置,seekdir函数利用该值设置目录流dirp的指针位置。
closedir函数关闭一个目录流并释放相关资源,成功时返回0,错误时返回-1。