Linux C 目录和文件
(2013-04-08 09:43:35)
标签:
it
2013-04-01 打伞的鱼
目录的创建与删除函数
在linux系统中,目录就是一个文件夹,文件可以存放在目录中。目录是一种特殊的文件夹,需要对目录进行权限管理。
————创建目录函数mkdir()
函数的使用方法:
int mkdir(char *pathname,mode_t mode);
在参数列表中,pathname是一个字符型指针,表示需要创建的目录路径,mode表示权限的八进制数字。
如果目录创建成功,则返回证书0,否则返回-1。
要使用这个函数,需要在程序中包含“sys/types.h”和“sys/stat.h”两个头文件。
——————删除目录函数rmdir()
函数的使用方法:
int rmdir(char *pathname);
文件的创建与删除函数
————创建文件函数creat()
函数的使用方法:
int creat(char *pathname,mode_t mode);
函数的参数pathname表示需要建立文件的文件名和目录名,mode表示这个文件的权限。
文件创建成功时返回创建文件的编号,否则返回-1。
使用这个函数需要在程序前面包含下面三个头文件:
#include
#include
#include
——————删除文件函数remove()
函数的使用方法:
int remove(char *pathname);
要使用这个函数需要在程序的最前面包含下面的头文件:
#include
——————建立临时文件函数mkstemp()
所谓临时文件,指的是程序运行时为了存储中间数据而建立的文件。计算机重启时,这写文件会自动删除。如果在程序运行时需要把文件短时间写到磁盘上,可以使用mkstemp函数临时创建一个临时文件。
函数的使用方法:
int mkstemp(char *template);
参数template表示需要建立临时文件的文件名字符串。文件名字符串中最后六个字符必须是XXXXXX。mkstemp函数会以可读写模式和0600权限来打开文件,如果文件不存在会建立这个文件,返回值是打开文件的编号,如果文件建立不成功则返回-1。
注意:参数template所指的文件名称字符串必须声明为数组,用下面的这种声明数组的方法声明:
char template[]="template-XXXXXX";
使用下面这种是不能运行的:char *template="template_XXXXXX";
文件的打开与关闭
文件的打开指的是从磁盘找到一个文件,返回一个整型的打开文件顺序编号。打开的文件处于可读可写状态。
文件的关闭指的是释放打开的文件,使文件处于不可读写的状态。
——————打开文件函数open/文件打开方式的设置
函数的使用方法:
int open(char *pathname,int flags);
int open(char *pathname,int flags,mode_t mode);
用这个函数打开文件时,如果正确的打开了这个文件,则返回这个文件的编号,否则返回0.
使用这个函数时,需要包含下面这些头文件:
#include
#include
#include
参数pathname表示要打开文件的路径字符串。参数flags是系统定义的一些整型常数,表示文件的打开方式。
flags的可选值如下所示:
O_RDONLY:以只读方式打开文件
O_WRONLY:以只写方式打开文件
O_RDWR:以读写方式打开文件
以上三种flags是互斥的,不可同时使用,但是可以和下列flags利用“|”运算符组合。
O_CREAT:若打开的文件不存在则自动建立
O_EXCL:如果O_CREAT已经被设置,此指令回去检查文件是否存在。文件若不存在则建立该文件。若O_CREAT和O_EXCL同时使用时,若打开的文件为一个链接,则会打开失败。
O_NOCTTY:如果要打开的设备为终端设备时,则不会将该终端机当作进程控制终端机。
O_TRUNC:若文件存在并且以可写的方式打开时,此标志会清空文件。这样原来的文件内容会消失。
O_APPEND:以附加的文件打开文件。当读写文件时会从文件尾开始向后移动,写入的数据会以附加的方式加入到文件后面。
O_NONBLOCK:以不可阻断方式打开文件,,也就是无论文件有无数据都去或者等待操作,都会立即打开文件。
O_NDELAY:O_NONBLOCK
O_SYNC:以同步的方式打开文件,所有的文件操作不写入缓存。
O_NOFOLLOW:如果参数pathname所指的文件为一个符号链接,则会打开失败。
O_DIRECTORY:如果参数pathname所指的文件的目录不存在,则打开文件失败。
——————打开文件的权限
在新建文件时需要设置新文件权限。参数mode定义了下面这些参数,可以直接使用这些常数来设置文件的权限,这些权限设置只有在建立新文件时才会有效。
S_IRWXU:00700权限,该文件所有者具有可读可写可执行的权限。
S_IRUSR或S_IREAD:00400权限,该文件所有者具有可读权限。
S_IWUSR或S_IWRITE:00200权限,该文件所有者具有可写权限。
S_IXUSR或S_IEXEC:00100权限,该文件所有者具有可执行权限。
S_IRWXG:00070权限,该文件用户组具有可读可写可执行权限。
S_IRDRP:00040权限,该文件用户组具有可读权限。
S_IWGRP:00020权限,该文件用户组具有可写权限。
S_IXGRP:00010权限,该文件用户组具有可执行权限。
S_IRWXO:00007权限,其他用户具有可读可写可执行权限。
S_IROTH:00004权限,其他用户具有可读权限。
S_IWOTH:00002权限,其他用户具有可写权限。
S_IXOTH:00001权限,其他用户具有可执行权限。
注意:记忆时候可以找到规律~
——————关闭文件函数close()
函数close的作用是关闭一个已经打开的文件。使用完文件后需要使用close函数关闭i该文件,这个操作会让数据写回磁盘,并释放该文件所占用的资源。
该函数的使用方法是:
int close(int fd);
参数fd是用open函数打开文件时返回的打开序号。如果成功关闭文件则返回0,否则返回-1.在关闭文件时,可能返回EBADF错误,表示需要关闭的文号不存在。
在使用这个函数时,需要包含下列头文件:
#include
2013年4月2日
文件读写
在进行文件写入操作时,只是在文件的缓冲区中操作,可能没有立即写到文件中。需要使用sync或者fsynx函数将缓冲区中的数据写入到文件中。
————在文件中写字符函数write
函数write可以把一个字符串写入到一个已经打开的文件中。这个函数的使用方法为:
ssize_t write(int fd,void *buf,size_t count);
在参数的列表中,fd表示已经打开的文件号,buf是需要写入的字符串,count是一个整型数,表示需要写入的字符个数。size_t是一个相当于整型的数据类型,表示需要写入字节的数目。将字符串写入文件以后,文件的写位置也会随之移动。
如果写入成功,write函数会返回实际写入的字节数,发生错误则返回-1。
————读取文件函数read
函数read()可以从一个打开的文件读取字符串,这个函数的使用方法是:
ssize_t read(int fd,void *buf,size_t count);
在参数列表中,fd表示已经打开的文件编号。buf是一个空指针,读取的内容会返回到这个指针指向的字符串。count表示需要读取的字符的个数。返回值表示取到的字符串的个数,如果返回0,则表示已经到达文件末尾或者文件中没有内容可以读取。在读文件的时候,文件的读位置随着读取到的字节移动。当发生到错误时,返回值-1。
———————文件读写位置的移动
每一个已经打开的文件都有一个读写位置。当打开文件的时候通常读写位置是指向文件开头,若是以附加的形式打开文件,则读写位置会指向文件末尾。read或write函数读写文件的时候,读写位置会随读写的字节相应移动。可以用lseek函数在文件内容中的位置上面移动,这样就可以在文件中的不同位置进行读写。这个函数的使用方法:
off_t lseek(int fd,off_t offset,int whence);
在参数列表中,fd表示用open函数打开的文件返回编号,参数offset表示根据参数whence来读写位置的位移数,whence表示系统定义的常量,可能有下面这些赋值:
SEEK_SET:参数offset即为新的读写位置。
SEEK_CUR:以目前的读写位置往后增加offset个位移量。
SEEK_END:将读写位置指向文件末尾后再增加offset个位移量。
当whence值为SEEK_CUR或SEEK_END时,参数offset允许负值的出现,这是表示在当前位置或者文件末尾位置上向前移动若干个字节。下面是一些常用的文件位置移动:
lseek(int fd,0,SEEK_SET):将读写位置移动到文件开头。
lseek(int fd,0,SEEK_END):将读写位置移动到文件结尾。
lseek(int fd,0,SEEK_CUR):取得当前文件的位置。
函数调用成功时会返回这个文件当前的读写位置,即距离开头多少个字节。若有错误则返回-1.
要使用这个函数需要包含下列头文件:
#include
#include
2013年4月8日
——————将缓冲区数据写入到磁盘函数sync
所谓缓冲区,是Linux系统对文件的一种处理方式。在对文件进行写操作的时候,并没有立即把数据写入磁盘,而是把数据写入到缓冲区中。如果需要把数据立即写入到吸盘,可以使用sync函数。用这个函数强制写入缓冲区数据的好处的话i保证数据有同步。这个函数的使用方法如下:
int sync(void)
这个函数会对当前程序打开的所有文件进行处理,韩寒苏没有参数,返回值为0.
要使用这个函数需要包含下列头文件
#include
————————将缓冲区数据写入到磁盘函数fsync
函数fsync的从用是将缓冲区数据写入到磁盘。与sync函数不同的是,这个函数可以制定打开文件的编号。这个函数的使用方法如下:
int fsync(int fd);
参数fd是open函数打开文件时返回的编号。函数如果执行成功则返回0,否则返回-1.
要使用这个函数需要包含下列头文件
#include
文件的锁定
所谓文件的锁定,指的是以独占的方式打开文件。一个程序打开文件以后,其它的程序不能读取或者写入文件。文件的锁定有利于文件的一致性。
————————文件锁定函数flock
在访问一个文件时,可以用flock函数对文件进行锁定,防止其他用户同时访问这个文件发生数据不一致的情况。这个函数的使用方法如下:
int flock(int fd,int operation);
在参数列表中,fd是open函数打开文件时返回的打开序号。operation是系统定义的一些整型常量,可能的取值如下:
LOCK_SH:建立共享锁定。其他程序可以同时访问这一个文件夹。多个程序可以同时对一个文件建立共享锁定。
LOCK_EX:建立互斥锁定。其他用户不能同时访问这一个文件,一个文件同时只有一个互斥锁定。单一文件不能同时建立共享锁定与互斥锁定。
LOCK_UN:解除文件锁定状态。
LOCK_NB:无法建立锁定时,此操作不可阻断,马上返回进程。通常与LOCK_SH或LOCK_EX做OR(|)组合。
——————————文件锁定函数fcntl
函数fcntl的作用是对一个文件进行锁定。与flock函数不同的是,fcntl可以设定对文件的某一部分进行锁定,该函数的使用方法如下所示:
int fcntl(int fd);
int fcntl(int fd,int cmd,long arg)
int fcntl(int fd,int cmd,struct flock *lock);
参数fd是open
函数打开文件时返回的文件编号,cmd是系统定义的一些整型常量,用来设置文件的打开方式。参数lock指针为flock类型结构体指针,用来设置锁定文件的一个区域。
flock结构体的定义方式如下所示:
struct flock
{
short int l_type;//文件的锁定状态
short int l_whence;//设置l_start位置
off_t l_start;//锁定区域的开头位置,从这个位置开始锁定文件的内容
off_t l_len;//锁定文件区域的大小
pid_t l_pid;//锁定文件的进程
};
使用这个函数需要包含下列头文件:
#include
#include
文件的移动和复制
——————文件的移动函数rename
在同一个分区中移动函数可以用rename函数。该函数的使用方法如下所示:
int rename(char *oldpath,char *newpath);
在参数列表中,oldpath表示原文件的路径,newpath表示新文件的路径。文件移动成功将返回0,不成功返回-1.
该函数需用下列头文件:
#include
在C程序中,没有直接复制一个文件的函数。如果需要复制一个文件,可以分别打开源文件和目标文件。依次从源文件中读取一定长度的内容,然后写入到目标文件中。
//需要掌握的知识包括目录的创建与删除,文件的创建与删除,文件的移动和复制,文件的锁定和权限,文件的缓冲区操作和文件的读写。难点在于文件的读写。
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。