标C取文件大小:
FILE* file = fopen("a.txt",""r);
fseek(file,0,SEEK_END);
long size = ftell(file);
各种文件相关函数:
stat(char* filename,struct stat* buf)
filename就是文件名,buf是传出参数,把硬盘上文件的信息存入buf中(效果等同于ls -l)。
inode - i节点,可以看成文件/目录在硬盘中的地址。ls -i 可以查看inode信息。
标C中,时间有两种常见类型:
time_t 秒差,是一个整数,与1970.1.1 0:0:0 的秒差
struct tm 是一个结构,包括以下成员:
年、月、日、小时、分、秒、星期几
计算机更倾向秒差,但人类更喜欢结构。
有转换函数:
ctime() localtime()
struct stat s = {};
stat("a.txt",&s);
文件大小:s.st_size
access()函数
truncate()/ftruncate()
指定文件的长度(大小)
truncate("a.txt",100);
在新建文件时,系统会屏蔽某些权限,如果想让系统改变对新建文件的权限屏蔽,函数umask()可以实现。
mmap()之映射文件 默认情况下,mmap()映射文件(硬盘上的文件),MAP_SHARED 会把数据存入文件中,MAP_PRIVATE 不会把数据存入文件中。mmap()时,保证文件的大小 要足够大,否则引发总线错误。 目录操作: mkdir() 新建一个目录 rmdir() 删除一个空目录,非空目录不行 chdir() 切换当前目录,对相对路径有影响 getcwd() 获取当前目录的绝对路径格式,但不负责打印 取目录的内存: opendir() 打开一个目录,准备读子项 readdir() 读取目录的一个子项 如果想读出所有的子项(子目录和子文件),可以使用循环,读到NULL结束。 DIR* opendir(char* dirpath) 参数是一个目录的路径,返回 目录指针。 opendir()只是打开了一个目录,没有读子项。 struct dirent* readdir(DIR* dir) 参数是一个打开的目录,返回一个结构指针,数据都存在结构中,读完了返回NULL。 struct dirent最重要的两个成员: d_type 子项的类型,比如是文件还是目录 d_name 子项的文件名/目录名 每次readdir()时,先读当前的子项,并移动到下一个子项上。
FILE* file = fopen("a.txt",""r);
fseek(file,0,SEEK_END);
long size = ftell(file);
各种文件相关函数:
stat(char* filename,struct stat* buf)
filename就是文件名,buf是传出参数,把硬盘上文件的信息存入buf中(效果等同于ls -l)。
stat()功能和fstat()一样,区别就在于stat()用文件名代表文件,fstat()用文件描述符代表文件。
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
//取文件大小必须会
int main(){
struct stat s = {};
int res = stat("a.txt",&s);
if(res == -1) perror("stat"),exit(-1);
printf("获取硬盘文件的属性成功\n");
printf("inode=%d\n",s.st_ino);
printf("size=%d\n",s.st_size);
printf("nlink=%d\n",s.st_nlink);
printf("tm=%s\n",ctime(&s.st_mtime));//转英文日期
printf("mode=%o\n",s.st_mode);
printf("权限:%o\n",s.st_mode & 07777);//取后4位
if(S_ISREG(s.st_mode)) //系统提供宏函数判断类型
printf("普通文件\n");
if(S_ISDIR(s.st_mode))
printf("目录\n");
}
inode - i节点,可以看成文件/目录在硬盘中的地址。ls -i 可以查看inode信息。
标C中,时间有两种常见类型:
time_t 秒差,是一个整数,与1970.1.1 0:0:0 的秒差
struct tm 是一个结构,包括以下成员:
年、月、日、小时、分、秒、星期几
计算机更倾向秒差,但人类更喜欢结构。
有转换函数:
ctime() localtime()
struct stat s = {};
stat("a.txt",&s);
文件大小:s.st_size
access()函数
可以获取文件的权限和判断文件是否存在
#include <stdio.h>
#include <unistd.h>
//access有权限返回0,所以要!
int main(){
if(!access("a.txt",R_OK)) printf("可读\n");
if(!access("a.txt",W_OK)) printf("可写\n");
if(!access("a.txt",X_OK)) printf("可执行\n");
if(!access("a.txt",F_OK)) printf("文件存在\n");
chmod("a.txt",0644);//改权限
truncate("a.txt",100);//改大小,多余的数据丢失
}
chmod()函数 - chmod("a.txt",0777);
truncate()/ftruncate()
指定文件的长度(大小)
truncate("a.txt",100);
在新建文件时,系统会屏蔽某些权限,如果想让系统改变对新建文件的权限屏蔽,函数umask()可以实现。
umask()用法:传入新的,返回旧的,使用过完毕后把旧的恢复回去。
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(){//了解即可
int fd1 = open("aa",O_RDWR|O_CREAT,0666);//664
mode_t old = umask(0022);//属主不屏蔽,其他屏蔽2
int fd2 = open("bb",O_RDWR|O_CREAT,0666);//644
umask(old);//还原成系统默认屏蔽
int fd3 = open("cc",O_RDWR|O_CREAT,0666);//664
close(fd1); close(fd2); close(fd3);
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
struct Emp{
int id;
char name[20];
double sal;
};
int main(){
int fd=open("em.dat",O_RDWR|O_CREAT|O_TRUNC,0666);
if(fd == -1) perror("open"),exit(-1);
void* p = mmap(0,sizeof(struct Emp)*3,
PROT_READ|PROT_WRITE,
//MAP_SHARED,//数据存入文件
MAP_PRIVATE,//数据不存入文件
fd,0);
if(p == MAP_FAILED) perror("mmap"),exit(-1);
ftruncate(fd,sizeof(struct Emp)*3);//指定大小
struct Emp* pe = p;//数据在文件中
pe[0].id = 100; strcpy(pe[0].name,"zhangfei");
pe[0].sal = 12000.0;
pe[1].id = 200; strcpy(pe[1].name,"guanyu");
pe[1].sal = 20000.0;
pe[2].id = 300; strcpy(pe[2].name,"liubei");
pe[2].sal = 24000.0;
int i;
for(i=0;i<3;i++)
printf("%d,%s,%lf\n",pe[i].id,pe[i].name,
pe[i].sal);
close(fd);
}
mmap()之映射文件 默认情况下,mmap()映射文件(硬盘上的文件),MAP_SHARED 会把数据存入文件中,MAP_PRIVATE 不会把数据存入文件中。mmap()时,保证文件的大小 要足够大,否则引发总线错误。 目录操作: mkdir() 新建一个目录 rmdir() 删除一个空目录,非空目录不行 chdir() 切换当前目录,对相对路径有影响 getcwd() 获取当前目录的绝对路径格式,但不负责打印 取目录的内存: opendir() 打开一个目录,准备读子项 readdir() 读取目录的一个子项 如果想读出所有的子项(子目录和子文件),可以使用循环,读到NULL结束。 DIR* opendir(char* dirpath) 参数是一个目录的路径,返回 目录指针。 opendir()只是打开了一个目录,没有读子项。 struct dirent* readdir(DIR* dir) 参数是一个打开的目录,返回一个结构指针,数据都存在结构中,读完了返回NULL。 struct dirent最重要的两个成员: d_type 子项的类型,比如是文件还是目录 d_name 子项的文件名/目录名 每次readdir()时,先读当前的子项,并移动到下一个子项上。
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
void print(char* path){//把代码写一下
DIR* dir = opendir(path);
if(dir == NULL) return;//结束递归但不结束进程
struct dirent* ent;
while(ent=readdir(dir)){//先read,后赋值,再判断
if((strcmp(ent->d_name,".")==0) ||
(strcmp(ent->d_name,"..")==0)) continue;
if(ent->d_type == 4){//子项是目录
printf("[%s]\n",ent->d_name);//dname不包括路径
char buf[100] = {};
sprintf(buf,"%s/%s",path,ent->d_name);
print(buf);//递归调用打印子目录
}else{//子项是 文件
printf("%s\n",ent->d_name);
}
}
}
int main(){
print("../");
//显示UC目录下的所有子项,子目录的内容也要显示出来
//思路:先读UC目录的子项,如果子项是目录,打印出来
//然后递归调用print(),如果子项是文件,直接打印
}