[C] 創建目錄_mkdir()函數


  在使用面函數的時候,容易出現找不到頭文件,可以通過Linux下的find命令查找是否存在其他目錄中(find /usr/include -name "io.h"),然后將其拷貝到“/usr/include/”目錄下,一般需要root權限。

一、創建目錄

共有兩種方式,可以選擇其中一種,推薦第二種,可以直接設置權限。

1.1 direct.h 頭文件

int mkdir(const char *path,mode_t mode);
函數名: mkdir   
功 能: 建立一個目錄   
用 法: int mkdir( const char *dirname );   
頭文件庫:direct.h   
返回值:創建一個目錄,若成功則返回0,否則返回-1

1.2 Linux下mkdir函數
頭文件庫:

#include <sys/stat.h>

#include <sys/types.h>

函數原型: int mkdir(const char *pathname, mode_t mode);

函數說明: mkdir()函數以mode方式創建一個以參數pathname命名的目錄,mode定義新創建目錄的權限。

返回值: 若目錄創建成功,則返回0;否則返回-1,並將錯誤記錄到全局變量errno中。

mode方式:

S_IRWXU 00700權限,代表該文件所有者擁有讀,寫和執行操作的權限
S_IRUSR(S_IREAD) 00400權限,代表該文件所有者擁有可讀的權限
S_IWUSR(S_IWRITE) 00200權限,代表該文件所有者擁有可寫的權限
S_IXUSR(S_IEXEC) 00100權限,代表該文件所有者擁有執行的權限
S_IRWXG 00070權限,代表該文件用戶組擁有讀,寫和執行操作的權限
S_IRGRP 00040權限,代表該文件用戶組擁有可讀的權限
S_IWGRP 00020權限,代表該文件用戶組擁有可寫的權限
S_IXGRP 00010權限,代表該文件用戶組擁有執行的權限
S_IRWXO 00007權限,代表其他用戶擁有讀,寫和執行操作的權限
S_IROTH 00004權限,代表其他用戶擁有可讀的權限
S_IWOTH 00002權限,代表其他用戶擁有可寫的權限
S_IXOTH 00001權限,代表其他用戶擁有執行的權限

 

1   用   int   access(const   char   *pathname,   int   mode);   判斷有沒有此文件或目錄 --它區別不出這是文件還是目錄
2   用   int   stat(const   char   *file_name,   struct   stat   *buf); 判斷該文件或目錄是否否存在 ;得到st_mode,然后判斷是不是目錄文件。 
    stat()系統調用看是否成功,不成功就不存在,成功判斷返回的st_mode是否是一個文件夾。

********************************************************************
1.3 linux c關於目錄是否存在,新建目錄等操作
1. 創建目錄

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

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

運用條件:只能在已存在的目錄下建立一級子目錄

返回值:  返回0表示成功,返回-1表述出錯。

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.

代碼
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <cstddef>
int main()
{
 if(NULL==opendir("/d1/liujian/readdb/adTest/data/html"))
   mkdir("/d1/liujian/readdb/adTest/data/html",0775);
 return 0;
}

 

以上代碼可以測試一個目錄是否存在,如果不存在就創建這個目錄。

[cpp]  view plain  copy
 
 print?
    1. ***********************************  
    2.   
    3. #include<stdio.h>  
    4. #include<string.h>  
    5. #include<errno.h>  
    6.   
    7. #include<unistd.h>  
    8.   
    9. #include<dirent.h>  
    10. #include<sys/types.h>  
    11. #include<sys/stat.h>  
    12.   
    13. extern int errno;  
    14.   
    15. #define MODE (S_IRWXU | S_IRWXG | S_IRWXO)  
    16.   
    17. int mk_dir(char *dir)  
    18. {  
    19.     DIR *mydir = NULL;  
    20.     if((mydir= opendir(dir))==NULL)//判斷目錄   
    21.     {  
    22.       int ret = mkdir(dir, MODE);//創建目錄  
    23.       if (ret != 0)  
    24.       {  
    25.           return -1;  
    26.       }  
    27.       printf("%s created sucess!/n", dir);  
    28.     }  
    29.     else  
    30.     {  
    31.         printf("%s exist!/n", dir);  
    32.     }  
    33.   
    34.     return 0;  
    35. }  
    36.   
    37. int mk_all_dir(char *dir)  
    38. {  
    39.     bool flag = true;  
    40.     char *pDir = dir;  
    41.     while (flag)  
    42.     {  
    43.         char *pIndex = index(pDir, '/');  
    44.         if (pIndex != NULL && pIndex != dir)  
    45.         {  
    46.             char buffer[512] = {0};  
    47.             int msg_size = pIndex - dir;  
    48.             memcpy(buffer, dir, msg_size);  
    49.             int ret = mk_dir(buffer);  
    50.             if (ret < 0)  
    51.             {  
    52.                 printf("%s created failed!/n", dir);  
    53.             }  
    54.         }  
    55.         else if (pIndex == NULL && pDir == dir)  
    56.         {  
    57.             printf("dir is not directory!/n");  
    58.             return -1;  
    59.         }  
    60.         else if (pIndex == NULL && pDir != dir)  
    61.         {  
    62.             int ret = mk_dir(dir);  
    63.             if (ret < 0)  
    64.             {  
    65.                 printf("%s created failed!/n", dir);  
    66.             }  
    67.   
    68.             break;  
    69.         }  
    70.   
    71.         pDir = pIndex+1;  
    72.   
    73.     }  
    74.   
    75.     return 0;  
    76. }  
    77.   
    78.    
    79.   
    80. int main()  
    81. {  
    82.     char buffer[512] = {0};  
    83.     printf("please input path mane/n");  
    84.     fgets(buffer, sizeof(buffer), stdin);  
    85.       
    86.     char *pIndex = index(buffer, '/n');  
    87.     if (pIndex != NULL)  
    88.     {  
    89.         *pIndex = '/0';  
    90.     }  
    91.   
    92.     printf("check path mane %s/n", buffer);  
    93.   
    94.     int ret = mk_all_dir(buffer);  
    95.     if (ret < 0)  
    96.     {  
    97.         printf("% mkdir failed!/n", buffer);  
    98.         return -1;  
    99.     }  
    100.   
    101.     return 0;  
    102. }  

二、更改權限

相關函數:fchmod, stat, open, chown

頭文件:#include <sys/types.h>   #include <sys/stat.h>
定義函數:int chmod(const char * path, mode_t mode);
函數說明:chmod()會依參數mode 權限來更改參數path 指定文件的權限。

返回值:權限改變成功返回0, 失敗返回-1, 錯誤原因存於errno.

參數 mode 有下列數種組合:
1、S_ISUID 04000 文件的 (set user-id on execution)位
2、S_ISGID 02000 文件的 (set group-id on execution)位
3、S_ISVTX 01000 文件的sticky 位
4、S_IRUSR (S_IREAD) 00400 文件所有者具可讀取權限
5、S_IWUSR (S_IWRITE)00200 文件所有者具可寫入權限
6、S_IXUSR (S_IEXEC) 00100 文件所有者具可執行權限
7、S_IRGRP 00040 用戶組具可讀取權限
8、S_IWGRP 00020 用戶組具可寫入權限
9、S_IXGRP 00010 用戶組具可執行權限
10、S_IROTH 00004 其他用戶具可讀取權限
11、S_IWOTH 00002 其他用戶具可寫入權限
12、S_IXOTH 00001 其他用戶具可執行權限

注:只有該文件的所有者或有效用戶識別碼為0,才可以修改該文件權限。

基於系統安全,如果欲將數據寫入一執行文件,而該執行文件具有S_ISUID 或S_ISGID 權限,則這兩個位會被清除。如果一目錄具有S_ISUID 位權限,表示在此目錄下只有該文件的所有者或root 可以刪除該文件。


錯誤代碼:
1、EPERM 進程的有效用戶識別碼與欲修改權限的文件擁有者不同, 而且也不具root 權限.
2、EACCESS 參數path 所指定的文件無法存取.
3、EROFS 欲寫入權限的文件存在於只讀文件系統內.
4、EFAULT 參數path 指針超出可存取內存空間.
5、EINVAL 參數mode 不正確
6、ENAMETOOLONG 參數path 太長
7、ENOENT 指定的文件不存在
8、ENOTDIR 參數path 路徑並非一目錄
9、ENOMEM 核心內存不足
10、ELOOP 參數path 有過多符號連接問題.
11、EIO I/O 存取錯誤

范例
/* 將/etc/passwd 文件權限設成S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH */
#include <sys/types.h>
#include <sys/stat.h>
main()
{
    chmod("/etc/passwd", S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM