示例1:向test.txt文件中写入数据
test.txt(假设已存在的test.txt的文件内容为123456789)
file1.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main()
{
int fd; //描述符
char filename[]="test.txt";
//如果文件存在
if(access(filename,F_OK) == 0)
{
printf("[%s] is already exits !\n",filename);
//删除文件(即把当前存在的文件删除重写)
unlink(filename);
}
//设置文件权限掩码
umask(0);
//创建文件
fd = open(filename,O_RDWR | O_CREAT,0777);
//如果打开文件失败
if(fd < 0)
{
printf("open file:%s,error:%s\n",filename,strerror(errno));
return -1;
}
//设置文件偏移,从文件尾开始
lseek(fd,0,SEEK_END);
//缓冲区内数据为ABCDEFG
char buffer[1024]="ABCDEFG";
//写数据,将缓冲区内的数据全部一次性写入
int w_len = write(fd,buffer,strlen(buffer));
printf("write len=%d\n",w_len);
//设置文件的偏移量为0,即文件的开始位置
lseek(fd,0,SEEK_SET);
//读数据
char readbuffer[1024]={0};
int nSize = read(fd,readbuffer,1024);
printf("%s\n",readbuffer);
struct stat st;
if(fstat(fd,&st) < 0)
{
perror("get stat error !\n");
return -1;
}
printf("%s‘s size=%d\n",filename,st.st_size);
//改变文件大小
ftruncate(fd,7);
//关闭文件
close(fd);
return 0;
}
编译并运行:gcc file1.c -o file1
之后再查看test.txt文件,发现内容已经改变。
示例2:复制文件(把b.txt文件内容复制到a.txt中)
b.txt
copyfile2.c
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main()
{
const char *pathname = "a.txt";
//文件描述符
int fdin;
int fdout;
int size;
char buffer[1024]={0};
//S_IRUSR=0400,权限为用户只读
fdin = open("b.txt",O_RDONLY,S_IRUSR);
if(-1 == fdin)
{
perror("Open file failed !\n");
return -1;
}
//创建文件a.txt,权限为用户可读可写可执行
fdout = creat(pathname,S_IRWXU);
if(-1 == fdout)
{
perror("Create file failed !\n");
return -1;
}
//读文件b.txt
size=read(fdin,buffer,1024);
if(size > 0)
{
//写文件a.txt
write(fdout,buffer,size);
printf("%s",buffer);
}
close(fdout);
close(fdin);
return 0;
}
编译并运行:gcc copyfile2.c -o copyfile2
示例3:测试文件类型(目录文件、普通文件、设备文件等)
file3.c
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
#include<dirent.h>
int main()
{
DIR *p_dir=NULL;
char filename[]="File_test";
//测试目录是否存在
//如果目录不存在则创建
if(access(filename,F_OK) != 0)
{
printf("文件不存在 !\n");
mkdir(filename);
}
//打开目录
p_dir=opendir(filename);
if(NULL==p_dir)
{
perror("创建目录失败!\n");
return -1;
}
struct dirent *p_dirent=NULL;
while((p_dirent=readdir(p_dir))!=NULL)
{
if(!(strcmp(p_dirent->d_name,".") || strcmp(p_dirent->d_name,"..")))
{
continue;
}
if(p_dirent->d_type==DT_DIR)
{
printf("%s是目录文件!\n",p_dirent->d_name);
}
else if(p_dirent->d_type==DT_REG)
{
printf("%s是规则文件!\n",p_dirent->d_name);
}
else
{
printf("%s是其他文件!\n",p_dirent->d_name);
}
}
closedir(p_dir);
return 0;
}
编译并测试运行:gcc file3.c -o file3
示例4:打印目录
打印当前目录下的各个文件名
file4.c
#include<stdio.h>
#include<dirent.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#include<unistd.h>
#include<sys/stat.h>
void printdir(char* dir,int depth)
{
DIR *dp;
struct dirent *entry;
struct stat statbuf;
if((dp=opendir(dir))==NULL)
{
fprintf(stderr,"cannot open dir:%s\n",dir);
return;
}
//切换到dir目录
chdir(dir);
while((entry=readdir(dp))!=NULL)
{
lstat(entry->d_name,&statbuf);
//如果是目录
if(S_ISDIR(statbuf.st_mode))
{
if(!strcmp(entry->d_name,".")||!strcmp(entry->d_name,".."))
{
continue;
}
printf("%*s%s\n",depth,"",entry->d_name);
//递归调用
printdir(entry->d_name,depth+4);
}
else
{
printf("%*s%s\n",depth,"",entry->d_name);
}
}
chdir("..");
closedir(dp);
}
int main()
{
printf("目录扫描......\n");
//当前目录
printdir("/home/jx/UFE/Class5",0);
printf("Done......\n");
return 0;
}
编译并运行:gcc file4.c -o file4