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\n",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()函数





本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/7047720.html,如需转载请自行联系原作者


相关文章
|
6月前
|
Linux 定位技术
Linux系统中的cd命令:目录切换技巧
踏过千山,越过万水,人生就是一场不断前行的旅程,总充满了未知与挑战。然而,“cd”命令如同你的旅伴,会带你穿梭在如棋盘一般的文件系统中,探索每一处未知。希望你能从“cd”命令中找到乐趣,像是掌控了一种络新妙的魔法,去向未知进发,开始你的探索之旅。
243 24
|
7月前
|
监控 Linux
Linux基础:文件和目录类命令分析。
总的来说,这些基础命令,像是Linux中藏匿的小矮人,每一次我们使用他们,他们就把我们的指令准确的传递给Linux,让我们的指令变为现实。所以,现在就开始你的Linux之旅,挥动你的命令之剑,探索这个充满神秘而又奇妙的世界吧!
145 19
|
8月前
|
存储 Linux
linux中的目录操作函数
本文详细介绍了Linux系统编程中常用的目录操作函数,包括创建目录、删除目录、读取目录内容、遍历目录树以及获取和修改目录属性。这些函数是进行文件系统操作的基础,通过示例代码展示了其具体用法。希望本文能帮助您更好地理解和应用这些目录操作函数,提高系统编程的效率和能力。
311 26
|
7月前
|
Linux
Linux目录删除指南:彻底解决“Is a directory”错误
在 Linux 系统中遇到 `cannot remove &#39;xxx&#39;: Is a directory` 错误,是因为删除目录时未使用正确参数。解决方法包括:1) 使用 `rmdir` 删除空目录或 `rm -r` 删除非空目录;2) 检查并调整目录权限(如通过 `sudo` 提权);3) 处理特殊场景,例如文件属性异常、特殊字符或进程占用;4) 替代方法如 `find -delete` 或文件系统修复。操作前建议备份数据,并启用防误删功能(如 `alias rm=&#39;rm -i&#39;`)。掌握 `rm` 和 `rmdir` 的区别是关键。
510 1
|
8月前
|
Linux
Linux文件与目录的日常
目录的切换 一般使用(”pwd“)显示当前所在的目录 比如:当前目录是在home下面的,与用户名相同的文件夹,可以使用(”cd“)命令来切换目录; 进入下载目录(”cd home/a/下载“)这种从给目录开头的一长串路经”叫做绝对路径“; 进入图片目录(”cd .. /图片/“)".."代表当前路径的上级路径,相对于当前的目录而言的”叫做相对路径“,(”.“)代表当前路径; 如果,想快速切换,上一个所在目录可以(”cd - / cd..“); 如果,想快速切换,追原始的目录可以(”cd --“); 查看目录及文件
85 14
|
存储 安全 Unix
探索Linux中的`mkdir`命令:创建目录的艺术
`mkdir`命令在Linux中用于创建目录,是文件管理的关键工具。它可以递归创建目录(-p选项),设置新目录权限(-m选项)并显示详细信息(-v选项)。例如,`mkdir -p dir1/dir2/dir3`会创建多级目录,而`mkdir -m 700 secret`创建一个具有特定权限的目录。在处理项目数据时,常通过脚本批量创建目录,如创建多个年份销售数据的子目录。使用时注意检查目录是否存在,设置适当权限,并避免在根目录下操作。查阅`man mkdir`获取更多帮助。
|
Unix Linux Shell
Linux系统之mkdir与rmdir命令的基本使用
Linux系统之mkdir与rmdir命令的基本使用
203 1
Linux系统之mkdir与rmdir命令的基本使用
|
Linux
Linux mkdir命令:创建目录(文件夹)
mkdir 命令,是 make directories 的缩写,用于创建新目录,此命令所有用户都可以使用。mkdir 命令的基本格式为: [root@localhost ~]# mkdir [-mp] 目录名 -m 选项用于手动配置所创建目录的权限,而不再使用默认权限。 -p 选项递归创建所有目录,以创建 /home/test/demo 为例,在默认情况下,你需要一层一层的创建各个目录,而使用 -p 选项,则系统会自动帮你创建 /home、/home/test 以及 /home/test/demo。 【例 1】建立目录。 [root@localhost ~]#mkdir cangls
880 0
|
安全 Linux 测试技术
Linux系统-【文件管理】mkdir命令 – 创建目录文件
mkdir命令来自于英文词组“make directories”的缩写,其功能是用来创建目录文件。使用简单,但需要注意若要创建的目标目录已经存在,则会提示已存在而不继续创建,不覆盖已有文件。而目录不存在,但具有嵌套的依赖关系,例如a/b/c/d/e/f,要想一次性创建则需要加入-p参数,进行递归操作。
212 0
|
Linux
linux基本功系列之mkdir命令实战
linux基本功系列之mkdir命令实战
246 0
linux基本功系列之mkdir命令实战