linux c 笔记 文件(三)

一.获取文件的属性:stat、fstat 和lstat 函数


#include <sys/types.h>
#include <sys/stat.h>
int stat (const char * pathname  ,struct stat * buf ) ;
int fstat (int filedes  ,struct stat *buf );
int lstat (const char *file_name ,struct stat *buf ) ;

三个函数的返回:若成功则为 0,若出错则为- 1

给定一个pathname ,stat 函数返回一个与此命名文件有关的信息结构, fstat 函数获得已在描述符filedes 上打开的文件的有关信息。lstat 函数类似于stat ,但是当命名的文件是一个符号连接时,lstat 返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息。 (当以降序遍历目录层次结构时,需要用到 lstat。)


使用 stat 函数最多的可能是 ls -l命令,用其可以获得有关一个文件的所有信息。

二.设置文件属性

1.chmod和fchmod函数
这两个函数使我们可以更改现存文件的存取许可权。
#include <sys/types.h>
#include <sys/stat.h>
int chmod (const char *pathname ,mode_t mode ) ;
int fchmod (int filedes ,mode_t mode ) ;
两个函数返回:若成功则为 0,若出错则为- 1
chmod 函数在指定的文件上进行操作,而 fchmod 函数则对已打开的文件进行操作。
 


2.chown, fchown和lchown函数

chown 函数可用于更改文件的用户 ID和组ID。
#include <sys/types.h>
#include <unistd.h>
int chown (const char *pathname ,uid_towner ,gid_tgroup ) ;
int fchown ( int filedes, uid_t owner, gid _ t  group) ;
int lchown ( const char * pathname, uid_t owner, gid_t group) ;
三个函数返回:若成功则为 0,若出错则为- 1
除了所引用的文件是符号连接以外,这三个函数的操作相类似。在符号连接情况下, lchown 更改符号连接本身的所有者,而不是该符号连接所指向的文件。

3.文件截短truncate和ftruncate
有时我们需要在文件尾端处截去一些数据以缩短文件。将一个文件的长度截短为 0是一个特例,用O_TRUNC标志可以做到这一点。为了截短文件可以调用函数 truncate和ftruncate 。
#include <sys/types.h>
#include <unistd.h>
int truncate ( const char * pathname, off_t length) ;
int ftruncate ( int filedes, off_t length) ;
两个函数返回;若成功则为 0,若出错则为- 1
这两个函数将由路径名 pathname或打开文件描述符 filedes指定的一个现存文件的长度截短为length。如果该文件以前的长度大于 length,则超过length以外的数据就不再能存取。如果以前的长度短于length,则其后果与系统有关。如果某个实现的处理是扩展该文件,则在以前的文件尾端和新的文件尾端之间的数据将读作 0 (也就是在文件中创建了一个空洞 )。

4.utime函数
一个文件的存取和修改时间可以用 utime函数更改。
#include <sys/types.h>
#include <utime.h>
int utime ( const char * pathname, const struct utimbuf *buf) ;
返回:若成功则为 0,若出错则为- 1
此函数所使用的结构是:
struct utimbuf {
time_t actime;      /*access time*/
time_t modtime;        /*modification time*/
}
此结构中的两个时间值是日历时间
此函数的操作以及执行它所要求的优先权取决于 times参数是否是NULL.
(1) 如果times是一个空指针,则存取时间和修改时间两者都设置为当前时间。为了执行此操作必须满足下列两条件之一:
      ( a )进程的有效用户 I D必须等于该文件的所有者 I D
      ( b )进程对该文件必须具有写许可权。
(2) 如果times非空指针,则存取时间和修改时间被设置为 times所指向的结构中的值。此时,进程的有效用户I D必须等于该文件的所有者 I D,或者进程必须是一个超级用户进程。对文件只具有写许可权是不够的。
注意,我们不能对更改状态时间 st_ctime指定一个值,当调用 utime 函数时,此字段被自动更新。

5.umask函数
至此我们已说明了与每个文件相关联的 9个存取许可权位,在此基础上我们可以说明与每个进程相关联的文件方式创建屏蔽字。
umask函数为进程设置文件方式创建屏蔽字,并返回以前的值。 (这是少数几个没有出错返回的函数中的一个。)
#include <sys/types.h>
#include <sys/stat.h>
mode_t  umask (mode_t cmask );
返回:以前的文件方式创建屏蔽字
其中,参数cmask由9个常数( S_IRUSR , S_IWUSR 等)逐位“或”构成的。在进程创建一个新文件或新目录时,就一定会使用文件方式创建屏蔽字


三.目录操作
1.目录的创建 mrdir
#include <sys/types.h>
#include <sys/stat.h>
int mkdir (const char * pathname ,mode_t mode );
函数执行成功返回0 ,当有错误时返回-1,错误代码存入errno中,详细的错误代码说明请参考man手册
mkdir创建一个新的空目录,空目录中会自动创建...和..目录项,所创建的目录的存取许可权由 mode( mode &~umask )指定。
新创建目录的uid(所有者)与创建该目录的进程的 uid 一致。如果父目录设置了 st_gid位,则新创建的的目录设置也设置在 st_gid 位(目录被设置该位后,任何用户在此目录下创建文件的组id 与该目录的组id 相同)。

2.目录的删除,
#include <unistd.h>
int rmdir (const char * pathname );
函数执行成功返回0 ,当有错误时返回-1,错误代码存入errno中,详细的错误代码说明请参考man手册

3.获取当前目录 getwd
我们需要一个函数,它从当前工作目录开始,找到其上一级的目录,然后读其目录项,直到该目录项中的 i节点编号数与工作目录 i节点编号数相同,这样地就找到了其对应的文件。按照这种方法,逐层上移,直到遇到根,这样就得到了当前工作目录的绝对路径名。函数getcwd就是提供这种功能的。
#include <unistd.h>
char * getcwd ( char* buf, size_t size);
char * get_current_dir_name (void);
char * getwd(char * buf);
返回:若成功则为 buf, 或返回自动配置的字符串指针,若出错则为 NULL
 getcwd 向此函数传递两个参数,一个是缓存地址 buf,另一个是缓存的长度 size。该缓存必须有足够的
长度以容纳绝对路径名再加上一个 null 终止字符,否则返回出错,倘若buf 为null ,getcwd()会根据参数size 的大小自动分配内存(使用malloc()),如果size也是0,则getcwd会跟据工作目录提供的绝对路径的字符串长度来决定配置的内存大小进程可以在使用完字符串后利用free()来释放空间;


4.设置工作目录 chdir
#include <unistd.h>
int chdir (const char * path);
int fchair (int fd);
两个函数的返回:若成功则为 0,若出错则为- 1
在这两个函数中,可以分别用 pathname或打开文件描述符来指定新的当前工作目录。

5.获取目录信息opendir ,readdir 和 closedir函数
#include <sys/types.h>
#include <dirent.h>
DIR * opendir( const char * pathname) ;
返回:若成功则为指针,若出错则为 NULL;
opendir用于打开一个目录

#include <sys/types.h>
#include <dirent.h>
struct dirent * readdir ( DIR *dir) ;
返回:若成功则为指针,若在目录尾或出错则为 NULL
readdir用于读取目录中的内容

struct dirent * readdir
{    
    long d_ino;
    off_t d_off;
    unsigned short d_reclen /* length of this d_name */
    char d_name [NAME_MAX +1] /* file name (null - terminated ) */
}

#include <sys/types.h>
#include <dirent.h>
int closedir ( DIR *dir);
返回:若成功则为 0,若出错则为- 1
closedir用于关闭一个已经打开的目录

posted @ 2015-07-22 21:17  kaylee  阅读(197)  评论(0编辑  收藏  举报