正在加载……
专注、离线、切勿分心

//所有功能函数需要传递路径参数的,绝对路径和相对路径都是可以的,函数会自动识别出是绝对路径和相对路径。“/”开始的是绝对路径,没有的是相对路径;相对路径函数会自动加上当前程序所运行的路径pwd,构成一个绝对路径
改变目录或文件的访问权限:

#include <sys/stat.h>
int chmod(const char* path, mode_t mode);  //mode(8进制)形如:0777,path(路径)参数指定的文件被修改为具有mode参数给出的访问权限 ;成功返回0,失败返回-1

test.c
#include<sys/stat.h>
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char** argv)
{
    if(argc!=2)
    {
        printf("error args\n");
        return -1;
    }
    int ret =chmod(argv[1],0777);
    if(ret!=0)
    {
        perror("chmod");
        return -1;
    }
    return 0;
}


获取、改变当前目录:
原型为:

#include <unistd.h>     //头文件
char *getcwd(char *buf, size_t size);       //获取当前目录,相当于pwd命令, 参数通常(NULL,0)
int chdir(const char *path);                //修改当前目录为参数所指定的目录,即切换目录,相当于cd命令;成功返回 0,失败返回 -1。

其中:
getcwd()函数:将当前的工作目录绝对路径复制到参数buf所指的内存空间,参数size为buf的空间大小. 在调用此函数时,buf所指的内存空间要足够大,若工作目录绝对路径的字符串长度超过参数size大小,则回值NULL,errno的值则为ERANGE。倘若参数buf为NULL,getcwd()会依参数size的大小自动配置内存(使用malloc()),如果参数size也为0,则getcwd()会依工作目录绝对路径的字符串长度来决定所配置的内存大小,进程可以在使用完此字符串后自动利用free()来释放此空间。所以常用的形式:getcwd(NULL, 0);

//getcwd.c
#include<stdio.h>
#include<unistd.h>
int main(int argc,char **argv)
{
        char path[128];
        char *p=NULL;
        int ret;
        char *retp = getcwd(path,sizeof(path));  
        if(NULL==retp)
        {
                perror("getcwd");
                return -1;
        }
        printf("path=%s\n",path);
        p = getcwd(NULL,0);
        printf("p=%s\n",p);
        return 0;

//chdir.c
#include<stdio.h>
#include<unistd.h>
int main(int argc,char **argv)
{
        char *p=NULL;
        p = getcwd(NULL,0);
        printf("p=%s\n",p);
        int ret=chdir(argv[1]);
        if(0!=ret)
        {
                perror("chdir");
                return -1;
        }
        p = getcwd(NULL,0);
        printf("after chdir p=%s\n",p);
        return 0;
}



注:如果 man 查函数查到的是命令,就加一个数字2,man 2 func

创建和删除目录:

原型为:

#include <sys/stat.h>
#include <sys/types.h>
int mkdir(const char *pathname, mode_t mode);    //创建目录,mode是目录权限(最终要和umask相减);成功返回0,失败返回-1
#include <unistd.h>
int rmdir(const char *pathname);   //删除目录;成功返回0,失败返回-1

//mkdir.c
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
int main(int argc,char **argv)
{
        int ret;
        ret = mkdir(argv[1],0777); 
        //普通用户缺省umask为002,最终argv[1] mode=775
        if(0!=ret)
        {
                perror("mkdir");
                return -1;
        }
        char *p = getcwd(NULL,0);
        printf("new create dir path is: %s\n",p);
        return 0;
}


//rmdir.c
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
//#include<stdlib.h>
int main(int argc,char **argv)
{
        int ret;
        ret = rmdir(argv[1]);
        //system("ls -l");
        if(0!=ret)
        {
                perror("rmdir");
                return -1;
        }
        return 0;
}






获取目录信息:

原型为:

#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);          //打开一个目录,返回目录流,失败返回NULL; 路径可以传相对路径也可以传递绝对路径
struct dirent *readdir(DIR *dir);        //读取目录的一项信息,并返回该项信息的结构体指针,执行完后dir自动偏移到下一个节点
void rewinddir(DIR *dir);                //重新定位到目录文件的头部
void seekdir(DIR *dir,off_t offset);     //用来设置目录流目前的读取位置,偏移不设置默认在开头
off_t telldir(DIR *dir);                 //返回目录流当前的读取位置
int closedir(DIR *dir);                  //关闭目录文件
struct dirent
{      
       ino_t  d_ino;               /* inode number(此目录进入点的inode) 也就是ls -ail 得到的第一个信息*/
       off_t  d_off;               /* offset to the next dirent(目录开头到进入点的位移) */
       unsigned short d_reclen;    /* length of this record(目录名的长度) */
       unsigned char d_type;       /* type of file(所指的文件类型) 4位,一共16种*/
       char   d_name[256];         /* filename(文件名) */
};                    
(存储不是连续的,不然删除一个目录,文件,所有都要移动)
读取目录信息的步骤为:
 用opendir函数打开目录;
 使用readdir函数迭代读取目录的内容,如果已经读取到目录末尾,又想重新开始读,则可以使用rewinddir函数将文件指针重新定位到目录文件的起始位置;
 用closedir函数关闭目录
opendir() 用来打开参数name指定的目录,并返回DIR*形态的目录流,和文件操作函数open()类似,接下来对目录的读取和搜索都要使用此返回值。函数失败则返回NULL;
readdir() 函数用来读取目录的信息,并返回一个结构体指针,该指针保存了目录的相关信息。有错误发生或者读取到目录文件尾则返回NULL;

//dirinfo.c
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<dirent.h>
int main(int argc,char **argv)
{
        DIR *dir=NULL;
        dir = opendir(argv[1]);
        if(NULL==dir)
        {
                perror("opendir");
                return -1;
        }
        struct dirent *q=NULL;
        off_t I;
        I = telldir(dir);  //记录文件偏移,应该在目录开头
        while((q = readdir(dir))!=NULL)
        {
                printf("%d %s\n",q->d_type,q->d_name);
                // I = telldir(dir);  //这里读完一次dir会自动偏到下一个位置,最后出循环的时候dir所指向的位置就不是在最后一个目录了,而是文件尾的下一个位置。
        }
        printf("-----------------------------------\n");
        //i = telldir(dir);  //得到的是文件尾的下一个位置,下面seekdir会发生段错误
        seekdir(dir,I);  //I 前面记录的是dir指向目录文件开头的位置,所以这就偏移到开头
        q  = readdir(dir);
        printf("%d %s\n",q->d_type,q->d_name);
        printf("-----------------------------------\n");
        rewinddir(dir);   // 偏移到文件开头
        printf("%d %s\n",q->d_type,q->d_name);
        closedir(dir);
        return 0;
}




// 4是目录文件,8是普通文件


printf(“%*s%s\n”,i, ”  ”,  ”hello”); 等价于 printf("%10s%s\n"," ","hello");
//test01.c
#include<stdio.h>
int main()
{
        printf("%*s%s\n",10," ","hello");
        printf("%*s%s\n",10,"~","hello");
        printf("%10s%s\n","~","hello");
        printf("1234567890\n");
        return 0;
}






2017/11/2 18:41:37

目录遍历:

//dirTravelsal.c
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<dirent.h>
#include<strings.h>
void traverse(const char *path,int width)
{
        DIR* dir=opendir(path);
        struct dirent* p=NULL;
        char buf[128];
        while( (p=readdir(dir))!=NULL )
        {
                if( (strcmp(p->d_name,"."))==0||(strcmp(p->d_name,".."))==0  )
                {
                        continue;
                }
                if( p->d_type==4 )
                {
                        bzero(buf,sizeof(buf));
                        printf("%*s%s\n",width," ",p->d_name);
                        //bzero(buf,sizeof(buf));
                        //sprintf(buf,"%s/%s",path,p->d_name);
//这两行代码拼凑出的是一个绝对路径。其实也可以注释掉,直接传一个相对路径,函数会自己识别,有'/'的它识别成绝对路径,没有的就是相对路径,表示当前程序运行目录下的这个路径。
                        traverse(p->d_name,width+4);
                }
                else
                {
                        printf("%*s%s\n",width," ",p->d_name);
                }
        }
}
int main(int argc,char **argv)
{
        char *path=NULL;
        path = getcwd(NULL,0);
        printf("%s\n",path);
        traverse(path,0);
        return 0;
}
//传入一个绝对路径或者相对路径,能够遍历该路径下所有文件并打印(深度遍历)


posted on 2018-02-03 10:00  正在加载……  阅读(1151)  评论(0编辑  收藏  举报