1、打开文件:
extern int open (__const char * __file, int __oflag, ...);
成功则返回该文件的描述符;否则返回-1.
flags:
O_RDONLY:以只读方式打开文件
O_WRONLY:以写方式打开文件
O_RDWR:以可读可写方式打开文件
O_CREATE:若打开的文件不存在,则自动建立文件
O_EXCL:如果设置了O_CREATE,并且文件存在,则会导致打开文件错误。打开的文件为符号链接,也会导致打开失败。
O_NOCTTY:如果欲打开的文件为终端设备时,则不会将该终端机当成进程控制终端机。
O_TRUNC:若文件存在,且以可写的方式打开时,此标识令文件长度为0,该文件原来的数据将会丢失。
O_APPEND:当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。
O_NONBLOCK:以不可阻断方式打开,也就是无论有无数据读取或等待,都会立即返回进程之中。
O_NDELAY:同O_NONBLOCK
O_SYNC:以同步方式打开文件。
如果用O_CREATE打开方式,则需要用到第三个参数。它规定了文件的权限。在设置权限时,可采用直接设置为八进制的方式。如0666。也可以使用下表中的宏:
S_IRWXU 00700 权限,代表该文件所有者具有可读、可写及可执行的权限。
S_IRUSR 00400权限,代表该文件所有者具有可读取的权限。
S_IWUSR 00200 权限,代表该文件所有者具有可写入的权限。
S_IXUSR 00100 权限,代表该文件所有者具有可执行的权限。
S_IRWXG 00070权限,代表该文件用户组具有可读、可写及可执行的权限。
S_IRGRP 00040 权限,代表该文件用户组具有可读的权限。
S_IWGRP 00020权限,代表该文件用户组具有可写入的权限。
S_IXGRP 00010 权限,代表该文件用户组具有可执行的权限。
S_IRWXO 00007权限,代表其他用户具有可读、可写及可执行的权限。
S_IROTH 00004 权限,代表其他用户具有可读的权限
S_IWOTH 00002权限,代表其他用户具有可写入的权限。
S_IXOTH 00001 权限,代表其他用户具有可执行的权限。
S_IRUSR 00400权限,代表该文件所有者具有可读取的权限。
S_IWUSR 00200 权限,代表该文件所有者具有可写入的权限。
S_IXUSR 00100 权限,代表该文件所有者具有可执行的权限。
S_IRWXG 00070权限,代表该文件用户组具有可读、可写及可执行的权限。
S_IRGRP 00040 权限,代表该文件用户组具有可读的权限。
S_IWGRP 00020权限,代表该文件用户组具有可写入的权限。
S_IXGRP 00010 权限,代表该文件用户组具有可执行的权限。
S_IRWXO 00007权限,代表其他用户具有可读、可写及可执行的权限。
S_IROTH 00004 权限,代表其他用户具有可读的权限
S_IWOTH 00002权限,代表其他用户具有可写入的权限。
S_IXOTH 00001 权限,代表其他用户具有可执行的权限。
2.关闭文件:
extern int close(int __fd);
成功则返回0;否则返回-1
3.创建文件:
extern int create(__const char * __file, __mode_t mode);
这个函数等同于:
open(const char * pathname, (O_CREATE|O_WRONLY|O_TRUNC), mode_t mode);
成功则返该文件的描述符,有错误则返回-1.
4.文件控制:
extern int fcntl (int __fd, int __cmd, ...);
常用的cmd有:
#define F_DUPFD 0
#define F_GETFD 1
#define F_SETFD 2
#define F_GETFL 3
#define F_SETFL 4
(1)F_DUPFD:
复制文件描述符仅仅在当前进程打开的文件表项新增一项,该项指向内核为该文件分配的文件表项(struct file 结构体),操作这两个文件描述符任意一个将会影响另一个。
(2)F_SETFD与F_SETFL的区别:F_SETFD仅更改该文件描述符的信息,而F_SETFL则更改与该文件相关的所有文件描述符。
5.读取文件内容:
extern ssize_t read (int __fd, void * __buf, size_t __nbytes);
该函数从参数fd所指向的文件中读取__nbytes数据到buf指针所指的内存中,此函数返回值为实际读取到的字数。如果返回0,表示已经到达文件尾部或无数据可读。
6.写内容到文件:
extern ssize_t write(int __fd, __const void * __buf, size_t __n);
该函数尝试将以buf为起始地址的缓冲区前n个字节写入与打开文件描述符fd关联的文件内。成功则返回真正写入数据的大小;失败则返回-1。
7.文件定位:
extern __off_t lseek(int __fd, __off_t __offset, int __whence);
第一个参数为已经打开的文件描述符
第二个参数offset为根据参考位置(第三个参数)来移动读写位置的位移数。
第三个参数的值可有:
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
成功则返回当前读写位置距离文件头部的字节数;
失败则返回-1.
8.同步刷新内核缓冲区。
#include <unistd.h>
void sync(viod);
int fsync(int fildes);
int fdatasync(int fildes);
9.打开|关闭目录
#include <dirent.h>
DIR * opendir(const char * dirname);//成功则返回DIR *;失败返回NULL
int closedir(DIR * dirp);//成功返回0;失败返回-1
10.读写目录内容:
struct dirent * readdir(DIR * dirp);//此方法在多线程操作中会不安全。
struct dirent
{
long d_ino; //inode值
_kernel_off_t d_off; //从目录开始到当前目录条的距离
unsigned short d_reclen; //用以存储文件名的空间大小,根据文件名长度而有差异
char d_name[256]; //文件名,以'\0'结束.
}
11.定位目录位置:
long int telldir(DIR * dirp);
成功则返回一个long类似的位置值以指示目录中的当前位置;失败则返回-1.
void seekdir(DIR * dirp, long int loc);
rewinddir(DIR * dirp);//重置位置到开头
12.添加目录:
extern int mkdir(__const char * __path, __mode_t __mode);//成功则返回0,否则返回-1
13.删除目录:
extern int rmdir (__const char *__path);//成功返回0;失败则返回-1
14.获取当前工作路径:
#include <unistd.h>
extern char * getcwd(char *__buf, size_t __size);
将当前工作路径的绝对路径名置于由buf指定的数组中,并返回buf。size数值至少比所返回路径名的长度大1,否则返回NULL。如果设置buf为NULL,getcwd()将利用malloc()获取空间,此时,由getcwd返回的指针需要被释放。
//在源文件的开头加和宏定义:#define _GNU_SOURCE 就不会出现编译警告了。
extern char * get_current_dir_name(void);
成功则返回路径;失败则返回NULL。
15.修改当前工作路径。
extern int chdir(__const char *__path);//成功则返回0,失败则返回-1