从文件信息结构体stat说起:
struct stat{
mode_t st_mode;
ino_t st_ino;
dev_t st_dev;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
off_t st_size;
time_t st_atime;
time_t st_mtime;
time_t st_ctime;
blksize_t st_blksize;
blkcnt_t st_blocks;
};
输入这个结构体太不容易了。之所以还要敲它只是因为它太重要了,几乎所有与文件相关的信息都在其中,这也就自然形成了一条学习文件的线索。
为了理解各个成员变量我们需要来看看UNIX文件系统的一些基本知识:
UNIX文件系统特点:
1)分级树形结构;
2)文件物理块采用混合索引结构组织;
3)采用成组链接法管理空闲盘快;
UNIX文件涉及的存储结构:
未打开状态:
1)一个目录项,记录文件名和对应的索引节点编号;
2)一个磁盘索引节点项,用于记录文件的属性和说明信息, 驻留在磁盘上;
3)若干盘块,用以保存文件本身;
打开状态又增加:
1)一个内存索引节点项,该项驻留在内存中;
2)文件表中的记录项;
3)用户文件描述符表中的一个登记项;
UNIX文件的物理结构:
还是参见汤小丹编著的计算机操作系统(西安电子科技大学出版社)p383;
一些函数:
#include<sys/stat.h>
int stat(const char *pathname,struct stat *restrict buf);
这里要说一下关键字restrict 它的意思是只能通过buf指针才能改变buf指针所指的内存区的内容。
mode_t umask(mode_t cmask );
//设置调用进程的文件创建屏蔽字;
int chmod(const char *pathname, mode_t mode);
//改变文件访问权限(注意得有权限才回成功返回);
int chown(const char *pathname, uid_t ower , gid_t group);
//更改文件所有者用户ID和组ID;
int link(const char *existingpath , const char * newpath);
//为现存文件创建新的路径(硬链接)(这个困扰了我很长时间,总是把它当成快捷方式啦);
硬链接:和普通的文件路径一样也是文件路径,连接的同一个文件的路径可能不止一个(注意它和windows中是快捷方式不一样,是一个真正的路径);其实,快捷方式和符号连接类似;
int unlink(const char *pathname);
//删除现存的路径pathname,将pathname所引用的文件连接计
//数减一;
int symlink(const char *restrict pathname, const char * sympath);
//创建符号连接,是软连接;
目录的操作:
其实读目录就像读普通文件一样;
DIR * opendir(const char * pathname);
//打开目录,返回目录指针(多像打开文件呀);
struct dirent *readdir(DIR *dp);
//读目录中的目录项;
这里有必要说一下ent,其实它是entry (条目、项 还是你用有道查一查吧)dirent 就是目录项结构体,每次读一个目录项;
sturct dirent{
ino_t d_ino; /*文件索引节点编号*/
char d_name[NAME_MAX+1]; /*文件名*/
};
void rewinddir(DIR *dp);
// 想想标志文件io函数就懂它了。
int closedir(DIR *dp);
long telldir(DIR *dp);
void seekdir(DIR *dp,long len);
更改当前工作目录:
#include<unistd>
int chdir(cost char *pathname);
char *getcwd(char *buf , size_t size);
/*获得当前工作路径的绝对路径*/