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>