您好,欢迎访问三七文档
第4章文件的操作2本章重点Linux系统的文件属性不带缓存的文件I/O操作基于流的文件I/O操作特殊文件的操作34.1Linux系统文件的属性Linux系统中,文件的准确定义是不包含有任何其他结构的字符流。Linux系统,最常用的文件系统是ext2系统。提供的文件系统,是树形层次结构系统。Linux支持多种文件系统Linux系统的文件属性主要包括文件类型和文件权限两个方面。注意:FHS标准定义了文件系统中每个区域的用途和所需要的最小构成的文件和目录。44.1.1Linux文件类型Linux下最常见的文件类型有5种:普通文件、目录文件、链接文件、管道文件和设备文件。例4.1:设计一个程序,要求列出当前目录下的文件信息,以及系统“/dev/sda1”和“/dev/lp0”的文件信息。编辑源程序代码:54.1.1Linux文件类型Linux系统的主要文件类型:64.1.2Linux文件权限对于Linux系统中的文件来说,它的权限可以分为4种:可读取(Readable)、可写入(Writable)、可执行(eXecute)和无权限,分别用r、w、x和-表示。Linux系统按文件所有者、文件所有者同组用户和其它用户三类规定不同的文件访问权限。显示的作为权限的10个字符,可分为四部分:1.第一位:一般表示文件类型。2.第二位到第四位(第一组rwx):表示文件所有者的访问权限。3.第五位到第七位(第二组rwx):表示文件所有者同组用户的访问权限。4.第八位到第十位(第三组rwx):表示其他用户的访问权限。74.1.2Linux文件权限例4.2:设计一个程序,要求把系统中“/etc”目录下的passwd文件权限,设置成文件所有者可读可写,所有其他用户为只读权限。源程序代码:编译、运行后,使用ls–l命令查看“/etc/passwd”文件的权限[root@localhostroot]#ls-l/etc/passwd84.1.2Linux文件权限例4.3:设计一个程序,要求设置系统文件与目录的权限掩码。源程序代码:注意:运行一次此例的程序后,修改源程序中的掩码后,再次编译运行,文件“liu1”和“liu2”的权限并不改变。因为如果文件已经存在,touch只修改时间标记。如果要再次验证新的掩码,需要再次运行程序前删除原来的文件。94.1.2Linux文件权限chmod函数说明mode参数说明104.1.2Linux文件权限umask函数说明思考题:设计一个程序,要求Linux系统新建的文件权限是0400。114.1.3Linux文件的其他属性文件还有创建时间,大小等其他的属性。在Linux系统中,定义了stat结构体来存放这些信息。如果要获得文件的其他属性,可以使用stat函数或者fstat函数。stat函数用来判断没有打开的文件,而fstat函数用来判断打开的文件。使用较多的属性是st_mode,通过此属性可以判断给定的文件是一个普通文件还是其他文件类型。124.1.3Linux文件的其他属性例4.4:设计一个程序,应用系统函数stat获取系统中“/etc”目录下的passwd文件的大小。源程序代码:134.1.3Linux文件的其他属性stat函数说明思考题:1.设计一个程序,要求判断“/etc/passwd”的文件类型。使用st_mode属性,可以使用几个宏来判断:S_ISLNK(st_mode)是否是一个连接,S_ISREG是否是一个常规文件S_ISDIR是否是一个目录,S_ISCHR是否是一个字符设备,S_ISBLK是否是一个块设备,S_ISFIFO是否是一个FIFO文件,S_ISSOCK是否是一个SOCKET文件。2.设计一个程序,要求打开文件“/etc/passwd”,判断它的最后一次访问时间。144.2不带缓存的文件I/O操作Linux系统中,基于文件描述符的文件操作主要有:不带缓存的文件I/O操作和带缓存的文件流I/O操作。不带缓存的文件I/O操作,又称系统调用I/O操作,符合POSIX标准,设计的程序能在兼容POSIX标准的系统间方便地移植。不带缓存的文件I/O操作用到的主要函数:154.2.1文件的创建例4.5:设计一个程序,要求在“/home”目录下创建一个名称为“4-5file”的文件,并且把此文件的权限设置为所有者具有只读权限,最后显示此文件的信息。源程序代码:164.2.1文件的创建creat函数说明思考题:设计一个程序,要求在“/mnt”目录下创建一个名称为“usb”的文件,编辑、调试成功后,运行两次是否有问题?为什么?174.2.2文件的打开和关闭例4.6:设计一个程序,要求在“/home”下以可读写方式打开一个名为“4-6file”的文件,如果该文件不存在,则创建此文件,如果存在,将文件清空后关闭。源程序代码:184.2.2文件的打开和关闭open函数说明194.2.2文件的打开和关闭close函数说明思考题:设计一个程序,要求在“/mnt”目录下,打开名称为“usb”的文件,如果该文件不存在,则创建此文件,如果存在,将文件清空后关闭。204.2.3文件的读写操作文件读写操作中,经常用到的函数是read、write和lseek。例4.7:设计一个C程序,完成文件的复制工作。要求通过使用read函数和write函数复制“/etc/passwd”文件到“4-7test”文件中,文件名当程序运行时从键盘键入。源程序代码:214.2.3文件的读写操作Read、write函数说明思考题:1.设计一个程序,使用read函数从源文件读取数据,再用write函数写入到目标文件,源文件名和目标文件名都由键盘输入。2.设计一个程序,要求在“/mnt”目录下,打开名称为“usb”的文件,如果该文件不存在,则创建此文件,如果已存在,把字符串“usb作为优盘设备文件”写入此文件后关闭。224.2.4文件上锁Linux系统中,给文件上锁主要有建议性锁和强制性锁。给文件加建议性锁的是flock函数,给文件加强制性锁的是fcntl函数。一般情况下,系统使用强制性锁,而很少使用建议性锁。当一个文件被上锁后,内核将阻止其他任何文件对其进行读写操作。例4.8:设计一个程序,要求在“/home”下打开一个名为“4-8file”的文件,如果该文件不存在,则创建此文件。打开后对其加上强制性的写入锁,然后释放写入锁。源程序代码:234.2.4文件上锁注意:程序在终端中运行后会暂停,需要按任意健后程序才会继续运行。244.2.4文件上锁flock、fcntl函数说明思考题:设计一个程序,要求在“/mnt”目录下,打开名称为“usb”的文件,如果该文件不存在,则创建此文件。打开后对其加上强制性的写入锁,然后释放写入锁。254.3带缓存的流文件I/O操作带缓存的流文件I/O操作,是在内存开辟一个“缓存区”,为程序中的每一个文件使用。内存“缓存区”的大小,影响着实际操作外存的次数,内存“缓存区”越大,则操作外存的次数就少,执行速度就快、效率高。带缓存的文件I/O操作用到的主要函数264.3.1流文件的打开和关闭例4.9:设计一个程序,要求用流文件I/O操作打开文件“4-9file”,如果该文件不存在,则创建此文件。源程序代码:思考题:设计一个程序,要求用带缓存的流文件I/O操作,在“/tmp”目录下,打开名称为“tmpfile”的文件,如果该文件不存在,则创建此文件,如果存在,将文件清空后关闭。274.3.2流文件的读写操作例4.10:设计一个程序,要求把键盘上输入的字符写入文件“4-10file”,如果该文件不存在,则创建此文件。源程序代码:思考题:1.程序运行后,输入的字符如果是半角的中文,文件中能否写入?为什么?2.设计一个程序,要求用带缓存的流文件I/O操作,利用fputc函数把键盘上输入的字符串写入文件“/tmp/4-10tmp”,如果该文件不存在,则创建此文件。284.3.2流文件的读写操作例4.11:设计一个程序,要求把键盘上输入的字符写入文件“4-11file”,如果该文件不存在,则创建此文件。源程序代码:思考题:1.设计一个程序,要求用带缓存的流文件I/O操作,把键盘上输入的字符串写入文件“/tmp/4-11tmp”,如果该文件不存在,则创建此文件,多次运行程序多次输入字符串后,文件“/tmp/4-11tmp”中只保存最后一次输入的字符串。2.设计一个程序,要求用带缓存的流文件I/O操作,把文件“/tmp/4-11tmp”中的内容读取出来,在终端中打印输出。294.3.1流文件的打开和关闭例4.12:设计两个程序,要求一个程序把三个人的姓名和帐号余额信息,通过一次流文件I/O操作写入文件“4-12file”,另一个格式输出帐号信息,把每个人的帐号和余额一一对应显示输出。4-12fwrite.c,4-12fread.c程序代码:思考题:1.完善例4.12的程序,使得帐号和余额都可以从键盘输入,余额可以输入小数。2.设计一个程序,要求把一个文本文件“4-12test”中的数据读出,文本文件“4-12test”有两列数据,第一列是帐号(11位整数表示),第二列是帐号余额(double数据类型),两列数据间用逗号隔开,按帐号余额从小到大排序后,把排序后的数据写入文本文件“4-12sort”,帐号要和余额一一对应。304.3.4文件的定位实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。文件定位移动文件内部位置指针的函数主要有三个,即rewind函数、fseek函数和ftell函数。例4.13:设计一个程序,要求用fopen函数打开系统文件“/etc/passwd”,先把位置指针移动到第10个字符前,再把位置指针移动到文件尾,最后把位置指针移动到文件头,输出三次定位的文件偏移量的值。源程序代码:思考题:设计一个程序,要求从系统文件“/etc/passwd”读取偏移量从100至200之间的字符,写入“/tmp/pass”文件。314.4.1目录文件的操作目录文件是Linux中一种比较特殊的文件,它是Linux文件系统结构中骨架,对构成整个树型层次结构的Linux文件系统非常重要。对目录文件的操作可以使用mkdir函数、opendir函数、closedir函数、readdir函数和scandir函数等。324.4.1目录文件的操作例4.14:设计一个程序,要求读取系统目录文件“/etc/rc.d”中所有的目录结构。源程序代码:思考题:设计一个程序,要求读取“/etc”目录下所有的目录结构,并依字母顺序排列。334.4.2链接文件的操作Linux系统中的链接文件,有点类似于Windows系统中的“快捷方式”,但并不完全一样。1.软链接文件软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。链接文件甚至可以链接不存在的文件,这就产生一般称之为“断链”的问题,链接文件甚至可以循环链接自己。类似于编程语言中的递归。344.4.2链接文件的操作例4.15:设计一个程序,要求为“/etc/passwd”文件建立软链接“4-15link”,并查看此链接文件和“/etc/passwd”文件。源程序代码:思考题:设计一个程序,要求为“/bin”目录文件建立软链接为“bin”,并查看此链接文件和“/bin”目录文件。354.4.2链接文件的操作2.硬链接文件对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了愿有的内容,这时,系统就“忘记”了它曾经是硬链接文件,而把它当成一个普通文件。硬链接文件有两个限制:1.不允许给目录创建硬链接;2.只有在同一文件系统中的文件之间才能创建链接。364.4.2链接文件的操作例4.16:设计一个程序,要求为“/etc/passwd”文件建立软链接“4-16link
本文标题:文件操作
链接地址:https://www.777doc.com/doc-3382861 .html