2012年6月29日星期五

linux系统编程:目录操作函数总结

 
 

satan 通过 Google 阅读器发送给您的内容:

 
 

于 12-6-28 通过 averiany涂鸦馆 作者:averainy

获取当前目录

1.getcwd

#include <unistd.h>

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

成功调用getcwd()会以绝对路径名形式复制当前工作目录至由buf指向的长度size字节的缓冲区。并返回一个指向buf的指针。失败时,调用返回NULL,并设置errno。(EFAULT,EINVAL,ENOENT,ERANGE).

POSIX指出,如果buf是NULL,getcwd()的行为是未定义的。在这种情况下,Linux的c库将分配一个长度size字节的缓冲区,并在那存储当前工作目录。如果size为0,c库将分配足够大小的缓冲区存储当前工作目录。调用结束后,需要由应用程序负责使用free()来释放缓冲区。示例如下:

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h>  void main() {         char *cwd;         cwd=getcwd(NULL,0);         if(!cwd) {                 perror("getcwd");                 exit(EXIT_FAILURE);         }         printf("cwd = %s\n",cwd);         free(cwd); }

2.get_current_dir_name

linux的c库提供函数get_current_dir_name()来获得当前工作目录。他与getcwd(NULL,0)行为一致。

原型如下:

#define _GNU_SOURCE

#include <unistd.h>

char * get_current_dir_name(void);

成功返回分配的缓冲区首地址,失败返回NULL。需要用free()来释放缓冲区。

3.getwd

#define _XOPEN_SOURCE_EXTENDED

#include <unistd.h>

char * getwd(char *buf);

调用getwd会复制当前工作目录至长度至少PATH_MAX字节的buf。成功调用返回buf指针,失败返回NULL。

getwd()这个函数是为了向后兼容,因此不建议使用,推荐getcwd().

更改当前工作目录

linux为更改当前工作目录提供两个系统调用,一个接受目录路径名,而另一个接收指向已打开目录的文件描述符:

#include <unistd.h>

int chdir(const char *path);

int fchdir(int fd);

成功时两个调用均返回0.失败,返回-1.并设置errno。

创建目录

linux为创建新目录提供了一个标准的POSIX系统调用:

#include <sys/stat.h>

#include <sys/types.h>

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

成功调用mkdir会创建目录path,其权限位为mode(由当前umask修改),并返回0.调用失败返回-1.并设置errno。

在linux中,新建目录的权限位是(mode&umask&01777).

移除目录

标准的POSIX调用rmdir()将目录从文件系统层次上移除:

#Include <unistd.h>

int rmdir(const char *path);

调用成功,rmdir从文件系统移除path,并返回0.path指向的目录必须唯恐。调用失败时,rmdir()返回-1,并设置errno。

读取目录内容

开始读取目录内容前,你需要创建一个由DIR对象指向的目录流:

#Include <sys/types.h>

#include <dirent.h>

DIR * opendir(const char *name);

成功调用opendir会创建name所指向目录的目录流。目录流比指向打开目录的文件描述符保存的内容多了一些,主要增加的是一些元数据和保存目录内容的缓冲区。因此可以在给定目录流中获取该目录的文件描述符:

#define  _BSD_SOURCE

#include <sys/types.h>

#Include <dirent.h>

int dirfd(DIR *dir);

成功调用dirfd返回目录流dir的文件描述符。错误时,调用返回-1.dirfd是BSD扩展,不是POSIX标准函数。

使用opendir创建一个目录流后,程序可以使用readdir来读取目录流。

#include <sys/types.h>

#include <dirent.h>

struct dirent * readdir(DIR *dir);

成功调用readdir会返回dir指向的下个目录项。结构dirent指向目录项。当整个目录读完,readdir会返回NULL,调用失败时也返回NULL,为区别错误和已读完所有文件,应用程序必须在每次调用readdir之前将errno设置为0.并在之后检查返回值和errno。

使用closedir关闭由opendir打开的目录流:

#include <sys/types.h>

#Include <dirent.h>

int closedir(DIR *dir);

成功调用closedir会关闭由dir指向的目录流,包括目录的文件描述符,并返回0,失败时,返回-1,并设置errno为EBADF。

用于读取目录内容的系统调用

上面讨论的读取目录内容的函数都是c库提供的标准POSIX函数。在这些函数内部,则使用系统调用readdir()和getdents().

#include <unistd.h>

#include <linux/types.h>

#include <linux/dirent.h>

#include <linux/unistd.h>

#include <errno.h>

int readdir(unsigned int fd, struct dirent *dirp, unsigned int count);

int getdents(unsigned int fd, struct dirent *dirp, unsigned int count);

一般来说,不要使用这些系统调用,用户空间应用程序应使用C库的系统调用.opendir,readdir,closedir.


本文作者:averainy | 本文地址: 固定链接 | 我的腾讯微博|我的google+
本站文章除特殊标明者外均为原创,版权所有,如需转载,请以超链接形式注明作者和原始出处及本声明

相关日志


 
 

可从此处完成的操作:

 
 

没有评论:

发表评论