linux编程学习笔记1

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>



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章