Chinaunix首页 | 论坛 | 博客
  • 博客访问: 126664
  • 博文数量: 59
  • 博客积分: 106
  • 博客等级: 民兵
  • 技术积分: 375
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-24 03:18
文章分类

全部博文(59)

文章存档

2015年(2)

2013年(18)

2012年(39)

我的朋友

分类: LINUX

2012-12-06 20:46:50

1.存储目录中的文件信息(文件名、扩展名等等)
#include
struct dirent
{
   long d_ino; /* inode number 索引节点号 */
   off_t d_off; /* offset to this dirent 在目录文件中的偏移 */
   unsigned short d_reclen; /* length of this d_name 文件名长 */
   unsigned char d_type; /* the type of d_name 文件类型 */
   char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */
}

2.

typedef struct __dirstream DIR;
struct __dirstream

   {
void *__fd; /* `struct hurd_fd' pointer for descriptor.   */
char *__data; /* Directory block.   */
int __entry_data; /* Entry number `__data' corresponds to.   */
char *__ptr; /* Current pointer into the block.   */
int __entry_ptr; /* Entry number `__ptr' corresponds to.   */
size_t __allocation; /* Space allocated for the block.   */
size_t __size; /* Total valid data in the block.   */
__libc_lock_define (, __lock) /* Mutex lock for this structure.   */
   };


Unix环境高级编程_1.3 文件与目录


文件条目
头文件 : dirent.h
/usr/include/dirent.h

结构:DIR directory stream 该结构用于定义路径
包括:ino_t d_ino 文件编号 在中定义 
char d_name[] 文件条目 文件名长度不应该超过NAME_MAX
NAME_MAX 在limits.h中定义为: #define NAME_MAX 255

函数: 
int closedir(DIR *dir) // 关闭赋给dir的路径, 在此之后directory stream dir就不可用了 
// 0 成功, -1出错
DIR *opendir(const char *);

//*********************补充opendir函数内容***************************************/


头文件:#include  

               #include

定义函数:DIR * opendir(const char * name);   打开目录函数

函数说明:opendir()用来打开参数name 指定的目录, 并返回DIR*形态的目录流, 和open()类似, 接下来对目录的读取和搜索都要使用此返回值.

返回值:成功则返回DIR* 型态的目录流, 打开失败则返回NULL.

错误代码:
1、EACCESS 权限不足。
2、EMFILE 已达到进程可同时打开的文件数上限。
3、ENFILE 已达到系统可同时打开的文件数上限。
4、ENOTDIR 参数name 非真正的目录。
5、ENOENT 参数name 指定的目录不存在, 或是参数name 为一空字符串。
6、ENOMEM 核心内存不足。

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//*********************补充readdir函数内容***************************************/

定义函数 struct dirent * readdir(DIR * dir);    读取目录函数
函数说明 readdir()返回参数dir目录流的下个目录进入点。

返回值 成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回NULL。
附加说明 EBADF参数dir为无效的目录流。
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------

int readdir_r(DIR *restrict, struct dirent *restrict,
struct dirent **restrict);
void rewinddir(DIR *);
void seekdir(DIR *, long);
long telldir(DIR *);

结构:
struct dirent {
ino_t d_ino;
off_t d_off;
unsigned short d_reclen;
unsigned char d_type;
char d_name[256];
};

例子:
DIR *dp;
struct dirent *dirp;

if((dp = opendir(argv[1])) == NULL)
err_sys("can't open %s", argv[1]);

while((dirp = readdir(dp)) != NULL) // 读取dp下所有的dirent结构
printf("%s\n", dirp->d_name);

closedir(dp);


头文件 stdarg.h
void va_start(va_list ap, last);
type va_arg(va_list ap, type); // 获取va_list中对应类型的参数
void va_end(va_list ap); // 当调用va_end后,ap就变成未定义
void va_copy(va_list dest, va_list src); // va_list aq;
// va_copy(aq, ap);
// ...
// va_end(aq);

在stdarg.h中定义va_list主要用于对于调用函数来说,不知道要传入多少个参数和相应类型。
必须先申明一个va_list对象类型,然后使用va_start(), va_arg(), 和 va_end()宏

例子:
56
58 void err_quit(const char *fmt, ...)
59 {
60 va_list ap;
61 va_start(ap, fmt); 
62 err_doit(0, fmt, ap);
63 va_end(ap);
64 exit(1);
65 }


出错处理
头文件 errno.h
在errno.h中定义整形变量errno,被系统用来调用出错事件。



头文件 string.h
strerror, strerror_r 用字符串来描述错误号

头文件 stdio.h
int fflush(FILE *stream); # 强制清空stream的缓冲区
# fflush(stdout)清空stdout的缓冲区了
stdin, stdout, stderr - 标准的IO流
#include
extern FILE *stdin;
extern FILE *stdout;
extern FILE *stderr;

int fputc(int c, FILE *stream); # 向stream流写一个字符
int fputs(const char *s, FILE *stream); # 向stream流写字符串,不包括'\0'
int putc(int c, FILE *stream); # 向stream流写一字符,等同于fputc
int putchar(int c); # 等同于putc(c, stdout)
int puts(const char *s); # 向stdout输入字符串和回行符(newline)


例:
67
69 static void err_doit(int errnoflag, const char *fmt, va_list ap)
70 {
71 int errno_save;
72 char buf[MAXLINE];
73 
74 errno_save = errno;
75 vsprintf(buf, fmt, ap);
76 if (errnoflag)
77 sprintf(buf + strlen(buf), ": %s", strerror(errno_save));
78 strcat(buf, "\n");
79 fflush(stdout);
80 fputs(buf, stderr);
81 fflush(NULL);
82 return;
83 }


工作目录
头文件unisdt.h
int chdir(const char *path); // 修改当前的工作目录
int fchdir(int fd); // 


阅读(750) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~