• Linux C 创建目录函数mkdir相关【转】


    转自:http://blog.csdn.net/fallenink/article/details/8480483

    原文地址:http://sharp2wing.iteye.com/blog/1280802

    ————————————————————————————————————————————————

    I.Linux C 创建目录函数mkdir的mode设置问题 

    函数原型: 

    #include <sys/stat.h> 

    int mkdir(const char *path, mode_t mode); 

    参数: 

    path是目录名 

    mode是目录权限 

    返回值: 

    返回0 表示成功, 返回 -1表示错误,并且会设置errno值。 

    mode模式位: 

    mode 表示新目录的权限,可以取以下值: 

    S_IRUSR 
    S_IREAD 

    S_IWUSR 
    S_IWRITE 
    S_IXUSR 
    S_IEXEC 
    S_IRWXU 
    This is equivalent to (S_IRUSR | S_IWUSR | S_IXUSR). 
    S_IRGRP 
    Read permission bit for the group owner of the file. Usually 040. 
    S_IWGRP 
    Write permission bit for the group owner of the file. Usually 020. 
    S_IXGRP 
    Execute or search permission bit for the group owner of the file. Usually 010. 
    S_IRWXG 
    This is equivalent to (S_IRGRP | S_IWGRP | S_IXGRP). 
    S_IROTH 
    Read permission bit for other users. Usually 04. 
    S_IWOTH 
    Write permission bit for other users. Usually 02. 
    S_IXOTH 
    Execute or search permission bit for other users. Usually 01. 
    S_IRWXO 
    This is equivalent to (S_IROTH | S_IWOTH | S_IXOTH). 
    S_ISUID 
    This is the set-user-ID on execute bit, usually 04000. See How Change Persona. 
    S_ISGID 
    This is the set-group-ID on execute bit, usually 02000. See How Change Persona. 
    S_ISVTX 
    This is the sticky bit, usually 01000. 

    【man 2 mkdir可以查看下】


    例子: 

    #include <sys/types.h> #include <sys/stat.h> 
    int status; 

    status = mkdir("/home/newdir", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 

    这样就创建了一个newdir目录,权限通过ls -al 查看为 

    drwxr-xr-x 

    跟用linux命令mkdir创建的目录权限位一致。 



    II. linux下C语言创建多级目录 

    int   CreateDir(const   char   *sPathName)  
      {  
      char   DirName[256];  
      strcpy(DirName,   sPathName);  
      int   i,len   =   strlen(DirName);  
      if(DirName[len-1]!='/')  
      strcat(DirName,   "/");  
       
      len   =   strlen(DirName);  
       
      for(i=1;   i<len;   i++)  
      {  
      if(DirName[i]=='/')  
      {  
      DirName[i]   =   0;  
      if(  access(DirName,   NULL)!=0   )  
      {  
          if(mkdir(DirName,   0755)==-1)  
          {   
                          perror("mkdir   error");   
                          return   -1;   
          }  
      }  
      DirName[i]   =   '/';  
      }  
      }  
       
      return   0;  
      } 

    III.linux c 编程:创建一个线程,监视某个目录,一旦目录里出现新的文件,就将文件转移到指定的目录里去。 
    /* 
    头文件 
    */ 
    #define SRCPATH "srcpath/" 
    #define DSTPATH "dstpath/" 

    int movefile() 
    {
    DIR *dir; 
    struct dirent *dt; 
    FILE *fp1,*fp2; 
    char filename1[256],filename2[256]; 
    char buf[1024]; 
    int readsize,writesize; 

    if((dir = opendir(SRCPATH)) == NULL) 

    printf("opendir %s error ",SRCPATH); 
    return -1; 

    memset(filename1,0,sizeof(filename1)); 
    strcpy(filename1,SRCPATH); 
    memset(filename2,0,sizeof(filename2)); 
    strcpy(filename2,DSTPATH); 
    while(1) 

    while((dt = readdir(dir)) != NULL) 

    if(strcmp(dt->d_name,".")==0||strcmp(dt->d_name,"..")==0) 

    continue; 

    //如果这个目录里 还有目录,可以在这加判断 
    //这里假设初始为空目录 
    strcat(filename1,dt->d_name); 
    strcat(filename2,dt->d_name); 
    //如果进程资源较少可以直接用linux系统命令 

    fp1 = fopen(filename1,"rb"); 
    if(fp1==NULL) 

    printf("open %s failed /n",filename1); 
    return -1; 
    }

    fp2 = fopen(filename2,"wb"); 
    if(fp2==NULL) 

    printf("open %s failed /n",filename2); 
    fclose(fp1); 
    return -1; 


    while((readsize = fread(buf,sizeof(buf),1,fp1))>0) 

    //total += readsize; 
    memset(buf,0,sizeof(buf)); 
    writesize = fwrite(buf,sizeof(buf),1,fp2); 
    if(writesize!==readsize) 

    printf("write error"); 
    return -2; 
    fclose(fp1); 
    fclose(fp2); 
    }

    fclose(fp1); 
    fclose(fp2); 
    rmdir(filename2); 


    }

    int main(int argc,char **argv) 

    pthread_t id1; 
    int ret; 
    ret = pthread_create(&id1, NULL, (void*)movefile, NULL); 
    return ret; 

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    1. 创建目录 

          #include <sys/stat.h>
           #include <sys/types.h>

           int mkdir(const char *pathname, mode_t mode);

    其中,mode就用0777,0755这种形式。

    2. 判断一个目录是否存在

    可以使用opendir来判断,这是比较简单的办法。

           #include <sys/types.h>
           #include <dirent.h>

           DIR *opendir(const char *name);

           The  opendir()  function  opens  a  directory  stream  corresponding to the directory name, and returns a pointer to the directory stream.  The stream is positioned at the first entry in the directory.

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    access():判断是否具有存取文件的权限

    相关函数
        stat,open,chmod,chown,setuid,setgid
    表头文件
        #include<unistd.h>
    定义函数
        int access(const char * pathname, int mode);
    函数说明
        access()会检查是否可以读/写某一已存在的文件。参数mode有几种情况组合, R_OK,W_OK,X_OK 和F_OK。R_OK,W_OK与X_OK用来检查文件是否具有读取、写入和执行的权限。F_OK则是用来判断该文件是否存在。由于access()只作权限的核查,并不理会文件形态或文件内容,因此,如果一目录表示为“可写入”,表示可以在该目录中建立新文件等操作,而非意味此目录可以被当做文件处理。例如,你会发现DOS的文件都具有“可执行”权限,但用execve()执行时则会失败。
    返回值
        若所有欲查核的权限都通过了检查则返回0值,表示成功,只要有一权限被禁止则返回-1。
    错误代码
        EACCESS 参数pathname 所指定的文件不符合所要求测试的权限。
        EROFS 欲测试写入权限的文件存在于只读文件系统内。
        EFAULT 参数pathname指针超出可存取内存空间。
        EINVAL 参数mode 不正确。
        ENAMETOOLONG 参数pathname太长。
        ENOTDIR 参数pathname为一目录。
        ENOMEM 核心内存不足    
        ELOOP 参数pathname有过多符号连接问题。
        EIO I/O 存取错误。
    附加说明
        使用access()作用户认证方面的判断要特别小心,例如在access()后再做open()的空文件可能会造成系统安全上的问题。

    还可以参考:linux access()函数和readdir()函数

  • 相关阅读:
    复合梯形公式、复合辛普森公式 matlab
    拉格朗日插值和牛顿插值 matlab
    数值分析 最小二乘 matlab
    最短路径Dijkstra matlab
    最小生成数 克鲁斯卡尔 普里姆 matlab
    [ 9.9 ]CF每日一题系列—— 259A黑白棋盘检查问题
    Tarjan求缩点化强连通图
    CF每日一题系列 —— 415A
    [kuangbin]树链剖分 C
    [kuangbin]树链剖分 D
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/7047720.html
Copyright © 2020-2023  润新知