一、 文件操作
1、 获取文件属性
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
int stat(const char *filename, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *filename, struct stat *buf);
部分常用结构体成员:
st_mode : 文件的类型和存取权限
st_nlink : 文件硬连接数目
st_uid : 文件所有者的用户id
st_gid : 文件所有者的组id
st_size : 文件大小
st_mtime : 文件最后修改时间
st_atime : 文件最后访问时间
st_ctime : 文件最后(文件所有者、所有组、权限)更改时间
//输出时间时要用ctime()函数将时间转化为字符串输出
printf("mtime: %s\n", ctime(buf.st_mtime));
/*判断文件属性*/
S_ISLNK : 链接文件
S_ISREG : 一般文件
S_ISDIR : 目录文件
S_ISCHR : 字符设备文件
S_ISBLK : 块设备文件
S_ISFIFO: FIFO文件
S_ISSOCK: socket文件
2、 设置文件属性
1) 修改文件权限
#include<sys/types.h>
#include<sys/stat.h>
int chmod(const char *path, mode_t mode);//文件名
int fchmod(int fd, mode_t mode);//文件描述符
2) 修改文件用户id / 组id
#include<sys/types.h>
#include<unistd.h>
int chown(const char *path, uid_t owner, gid_t group);//文件名
int fchown(int fd, uid_t owner, gid_t group);//文件描述符
int chown(const char *path, uid_t owner, gid_t group);//适于链接文件
3) 修改文件大小
#include<sys/types.h>
#include<unistd.h>
int truncate(const char *path, off_t len);//文件名
int ftruncate(int fd, off_t len);//文件描述符
4) 修改文件时间
#include<sys/types.h>
#include<utime.h>
int utime(const char *filename, struct utimbuf *buf);
struct utimbuf{
time_t actime;//access time
time_t modtime;//modification time
}
2、 文件移动和删除
1) 文件移动
#include<stdio.h>
int rename(const char *oldname, const char *newname);
2) 文件删除
#include<unistd.h>
int unlink(const char *name);
int remove(const char *name);
//若有进程打开了文件,则文件暂时不被删除,直到所有打开该文件的进程都结束时才被删除
//若name指向socket文件、FIFO文件或设备文件时,该name被删除,但已打开该文件的进程仍然可以使用这些文件
3、目录操作
1) 目录的创建和删除
#include<sys/types.h>
#include<sys/stat.h>
int mkdir(const char *name, mode_t mode);//需设置文件权限
int rmdir(const char *name);//只能删除空目录
2) 获取当前目录
#include<unistd.h>
char * getcwd(char *buf, size_t size);
char getwd(char *buf);
//获得绝对路径
2) 设置工作目录
#include<unistd.h>
int chdir(const char *path);
int fchdir(int fd);
4、获取目录信息
#include<sys/types.h>
#include<dirent.h>
DIR *opendir(const char *name);
struct dirent *readdir(DIR *dir);
int closedir(DIR *dir);
struct dirent{
long d_ino;
off_t off;
unsigned short d_reclen;
char d_name;//filename
}
二、 其他总结
1、 磁盘分区分为主分区、扩展分区,而扩展分区有可分为若干逻辑分区,同时规定主分区、扩展分区之和最多为4个(原因:磁盘MBR分配有446字节,而分区表只占用64字节,而每个分区所存信息需要16字节,故最多有4个分区),扩展分区最多只能有1个。
2、 block为1k的inode可存储最大单一文件的大小为16GB。inode分为12个直接、1间接、1双间接、1三间接:
12个直接指向: 12 * 1K = 12K
间接 : 256 * 1K = 256K
双间接: 256 * 256 * 1K
三间接: 256 * 256 * 256 * 1K
总和: 12K + 256K + 256*256K + 256*256*256K = 16GB
3、什么是格式化?电子计算机上指用一种系统软件对硬盘或软盘进行处理,使符合数据存储和读取的规定格式。
为什么要进行格式化?每种操作系统所设置的文件属性、权限不同,为了存放这些文件所需的数据,就需要将分区进行格式化,以成为操作系统能够利用的文件系统格式。