判断目录是否存在并创建mkdir

本文详细介绍了 Linux 下 mkdir 函数的使用方法,包括其头文件、函数原型、参数含义及返回值。此外还提供了判断目录是否存在及递归创建目录的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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_IRWXU00700权限,代表该文件所有者拥有读,写和执行操作的权限
S_IRUSR(S_IREAD)00400权限,代表该文件所有者拥有可读的权限
S_IWUSR(S_IWRITE)00200权限,代表该文件所有者拥有可写的权限
S_IXUSR(S_IEXEC)00100权限,代表该文件所有者拥有执行的权限
S_IRWXG00070权限,代表该文件用户组拥有读,写和执行操作的权限
S_IRGRP00040权限,代表该文件用户组拥有可读的权限
S_IWGRP00020权限,代表该文件用户组拥有可写的权限
S_IXGRP00010权限,代表该文件用户组拥有执行的权限
S_IRWXO00007权限,代表其他用户拥有读,写和执行操作的权限
S_IROTH00004权限,代表其他用户拥有可读的权限
S_IWOTH00002权限,代表其他用户拥有可写的权限
S_IXOTH00001权限,代表其他用户拥有执行的权限


1   用   int   access(const   char   *pathname,   int   mode);   判断有没有此文件或目录 --它区别不出这是文件还是目录
2   用   int   stat(const   char   *file_name,   struct   stat   *buf); 判断该文件或目录是否否存在 ;得到st_mode,然后判断是不是目录文件。 
    stat()系统调用看是否成功,不成功就不存在,成功判断返回的st_mode是否是一个文件夹。

********************************************************************
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;
}

 

以上代码可以测试一个目录是否存在,如果不存在就创建这个目录。

***********************************

#include<stdio.h>
#include<string.h>
#include<errno.h>

#include<unistd.h>

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

extern int errno;

#define MODE (S_IRWXU | S_IRWXG | S_IRWXO)

int mk_dir(char *dir)
{
    DIR *mydir = NULL;
    if((mydir= opendir(dir))==NULL)//判断目录 
    {
      int ret = mkdir(dir, MODE);//创建目录
      if (ret != 0)
      {
          return -1;
      }
      printf("%s created sucess!/n", dir);
    }
    else
    {
        printf("%s exist!/n", dir);
    }

    return 0;
}

int mk_all_dir(char *dir)
{
    bool flag = true;
    char *pDir = dir;
    while (flag)
    {
        char *pIndex = index(pDir, '/');
        if (pIndex != NULL && pIndex != dir)
        {
            char buffer[512] = {0};
            int msg_size = pIndex - dir;
            memcpy(buffer, dir, msg_size);
            int ret = mk_dir(buffer);
            if (ret < 0)
            {
                printf("%s created failed!/n", dir);
            }
        }
        else if (pIndex == NULL && pDir == dir)
        {
            printf("dir is not directory!/n");
            return -1;
        }
        else if (pIndex == NULL && pDir != dir)
        {
            int ret = mk_dir(dir);
            if (ret < 0)
            {
                printf("%s created failed!/n", dir);
            }

            break;
        }

        pDir = pIndex+1;

    }

    return 0;
}

 

int main()
{
    char buffer[512] = {0};
    printf("please input path mane/n");
    fgets(buffer, sizeof(buffer), stdin);
    
    char *pIndex = index(buffer, '/n');
    if (pIndex != NULL)
    {
        *pIndex = '/0';
    }

    printf("check path mane %s/n", buffer);

    int ret = mk_all_dir(buffer);
    if (ret < 0)
    {
        printf("% mkdir failed!/n", buffer);
        return -1;
    }

    return 0;
}


<think>好的,我现在需要解决用户的问题:“Python判断目录是否存在创建目录”。首先,我得理解用户的需求。用户可能是在编写Python脚本时,需要处理文件操作,确保某个目录存在,如果不存在的话就自动创建它。这种情况在文件处理、日志记录等场景中很常见。 接下来,我应该回忆一下Python中处理目录的相关模块。记得标准库中的os模块和pathlib模块都可以处理目录和文件路径。用户可能希望了解这两种方法,或者其中一种更现代的方式。不过,用户没有具体说明,所以最好都介绍一下,让用户有选择。 首先,使用os模块的话,需要导入os。判断目录是否存在可以用os.path.exists()函数,传入路径参数。不过,直接判断是否目录的话,可能更准确,用os.path.isdir()。如果不存在,就需要创建目录创建目录可以用os.makedirs(),这个函数可以递归创建多层目录,比如如果父目录存在也会一起创建。而os.mkdir()只能创建单层目录,如果父目录存在会报错。所以通常更推荐使用os.makedirs(),且可以配合exist_ok参数,这样即使目录存在也不会报错,避免需要先检查是否存在。这可能简化代码,比如直接使用os.makedirs(path, exist_ok=True),这样就无需先判断是否存在,直接创建存在的话也不会报错。 然后是pathlib模块,这是Python 3.4引入的面向对象的路径处理方式,可能更现代和易用。Path对象有一个mkdir方法,同样可以设置exist_ok为True,这样就能实现同样的效果。使用pathlib的话,代码会更简洁,比如Path(path).mkdir(parents=True, exist_ok=True)。这里parents参数允许创建目录,类似于os.makedirs()的递归创建。 用户可能想知道这两种方法的区别和适用场景。os模块的方法比较传统,适合更底层的操作或者需要兼容旧版本Python的情况。而pathlib更面向对象,代码更易读,适合Python 3.4及以上版本。如果用户的项目已经使用较新的Python版本,推荐使用pathlib。 还需要注意错误处理。比如,在创建目录时,即使使用exist_ok=True,也可能因为权限问题或其他问题导致创建失败,这时候可能需要异常处理。但用户的问题可能只需要基本的方法,所以可能不需要深入讨论异常处理,除非用户特别提到。 另外,路径的表示方式需要注意,比如使用反斜杠还是正斜杠,在Python中字符串处理时可能需要转义,或者使用原始字符串。但使用pathlib的Path对象可以自动处理不同操作系统的路径分隔符问题,更省心。 总结下来,回答的结构应该是先介绍os模块的方法,包括检查目录是否存在创建目录,然后介绍pathlib的方法,比较两者的优缺点,最后给出示例代码。确保用户能够根据实际情况选择合适的方法,了解如何避免常见错误,比如目录存在时的处理。</think>在Python中判断目录是否存在创建目录,可以通过以下两种常用方法实现: --- ### 方法一:使用 `os` 模块 ```python import os path = "./my_directory" # 目标目录路径 # 判断目录是否存在 if not os.path.exists(path): # 创建目录(自动创建目录) os.makedirs(path) print(f"目录 {path} 创建成功") else: print(f"目录 {path} 已存在") # 更简洁的方式(直接创建,忽略已存在的情况) os.makedirs(path, exist_ok=True) # exist_ok=True 表示目录存在时不报错 ``` --- ### 方法二:使用 `pathlib` 模块(Python 3.4+ 推荐) ```python from pathlib import Path path = Path("./my_directory") # 目标目录路径 # 直接创建目录(自动处理父目录和已存在的情况) path.mkdir(parents=True, exist_ok=True) print(f"目录 {path} 已就绪") ``` --- ### 关键点说明: 1. **检查目录是否存在**: - `os.path.exists(path)`:检查路径是否存在(可以是文件或目录) - `path.exists()`(`pathlib`方法) 2. **创建目录**: - `os.makedirs()`:递归创建多层目录(父目录存在时会自动创建) - `Path.mkdir(parents=True)`:等效功能(`pathlib`方式) 3. **避免重复创建**: - `exist_ok=True` 参数可跳过“目录存在”的错误(推荐始终使用) --- ### 最终推荐方案: ```python from pathlib import Path target_dir = Path("your/directory/path") target_dir.mkdir(parents=True, exist_ok=True) # 一行代码解决问题 ``` 这种方法安全、简洁,且自动处理了路径分隔符的跨平台兼容性(Windows/Linux/macOS)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值