linux文件
sscanf与sprintf:格式化输入与输出字符串
示例:char *buf,int a,char b;
sprintf(buf,”%d %c”,a,b);//写入buf
sscanf(buf,”%d%c”,&a,&b);//从buf读
头文件:sys.stat.h
int chmod(char *path,mode_t mode);//文件权限修改为mode,受umask限制
头文件:unistd.h
char *getcwd(char *buf,size_t size);//获取当前目录,写入buf
char *p=getcwd(NULL,0);//获取当前目录写入p,但要注意返回的是函数内申请的空间,可能会释放空间,导致p变成野指针
int chdir(char *path);切换到path目录,成功返回0.失败返回-1
头文件:sys/stat.h,sys/types.h,unistd.h
int mkdir(char *path,mode_t mode);创建权限为mode的目录path,成功返回0,失败-1
int rmdir(char * pathname);删除目录,man 2 rmdir可以查看rmdir函数
头文件:sys/types.h,dirent.h
DIR *opendir(char *name);//打开一个目录,返回目录信息的结构体DIR,一般作为操作目录的参数
struct dirent *readdir(DIR *dir);//读取读取目录的一项信息,返回代表该项信息的结构体指针
每次readdir,目录流指针offset会指向下一个文件
void rewinddir(DIR *dir)定位到目录文件头部
void seekdir(DIR *dir,off_t offset);//设置目录流读取位置
off_t telldir(DIR *dir)//返回目录流当前读取位置
int closedir(DIR *dir);//关闭目录文件
头文件:sys/types.h,sys/stat.h/unistd.h
int stat(char *path,struct stat *buf);获取文件状态到buf
struct stat:
__dev_tst_dev;//返回设备表述符,0代表不是设备
__ino_t st_ino;//文件的inode,代表文件的唯一标识id
__nlink_t st_nlink;//硬链接数
__mode_t st_mode;//文件类型,1-15,4为目录,8为普通文件
__uid_tst_uid;//用户id
__gid_t st_gid;//组id
int __pad0;//
__dev_t st_rdev;//设备类型
__off_t st_size.//文件大小
__blksize_t st_blksize;//块大小
__blkcnt_tst_blocks;//块数
time_t st_atime 最后访问时间
time_t st_mtime 最后修改时间
time_t st_ctime 最后权限修改时间
struct dirent
{
__ino_t d_ino;//目录所在偏移文件的inode
__off_t d_off;//目录进入点到目录开头的偏移
unsigned short int d_reclen;//目录名的长度
unsigned char d_type;//文件类型
char d_name[256];//文件名
};
练习一:传递一个路径名,还有一个文件名,搜索对应路径下是否有该文件,有就打印显示,显示
绝对路径。
#include "func.h"//func.h中存放的是使用文件接口的头文件
int main(int argc,char **argv)
{
char newpath[50];
DIR* dir;
int ret;
struct dirent *p;
if(argc!=3)
{
printf("args error\n");
return -1;
}
ret=chdir(argv[1]);
if(-1==ret)
{
perror("chdir");
return -1;
}
dir=opendir(".");
while((p=readdir(dir))!=NULL)
{
if(strcmp(p->d_name,argv[2])==0)//文件名相等
{
break;
}
}
if(NULL==p)//对应路径没有文件
{
printf("对应路径没有文件\n");
}
return 0;
}
练习二:传递任意一个目录路径,能够显示该目录的ls -l的效果
int main(intargc,char *argv[])
{
int i;
int ret;
char time[50];
char newpath[50]={0};
DIR *dir;
struct stat buf;
struct dirent *p;
//int ret=chdir(argv[1]);
if(-1==ret)
{
printf("路径不存在\n");
return -1;
}
dir=opendir(argv[1]);
if(!dir)
{
perror("opendir");
return -1;
}
if(!dir)
{
perror("opendir");
return -1;
}
while((p=readdir(dir))!=NULL)
{
sprintf(newpath,"%s/%s",argv[1],p->d_name);
ret=stat(newpath,&buf);
if(-1==ret)
{
perror("stat");
return -1;
}
strcpy(time,ctime(&buf.st_mtime));
for(i=strlen(time)-9;i<strlen(time)-1;i++)
{
time[i]='\0';
}
printf("%x %ld %ld %s %s %ld %s%s\n",buf.st_mode,buf.st_nlink,buf.st_ino,getpwuid(buf.st_uid)->pw_name,getgrgid(buf.st_gid)->gr_name,buf.st_size,time,p->d_name);//要注意ctime(int *)
//还没完成完整功能
}
以下是func.h包含的头文件#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<dirent.h>
#include<string.h>