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>



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