插件窝 干货文章 mkdir函数在Linux中与Windows中的区别是什么

mkdir函数在Linux中与Windows中的区别是什么

Windows CreateDirectory 权限 mkdir 415    来源:    2025-04-22

mkdir 函数在 Linux 和 Windows 系统中的区别主要体现在 路径格式、权限控制、系统调用行为 以及 错误处理 等方面。以下是详细对比:


1. 路径格式差异

  • Linux/Unix
    • 使用正斜杠 / 作为路径分隔符(例如 /home/user/dir)。
    • 路径名区分大小写(Dirdir 是不同的目录)。
  • Windows
    • 使用反斜杠 \ 作为默认分隔符(例如 C:\Users\user\dir),但正斜杠 / 通常也能被兼容。
    • 路径名通常不区分大小写(Dirdir 可能被视为相同)。

2. 权限控制

  • Linux/Unix
    • 通过 mode_t mode 参数(如 0777)显式设置目录权限(受 umask 影响)。
    • 示例:
      c mkdir("/path/to/dir", 0755); // 所有者可读写执行,其他用户只读执行
  • Windows
    • 无直接的权限参数,权限继承父目录或由安全描述符(Security Descriptor)控制。
    • 示例(WinAPI):
      c CreateDirectory("C:\\path\\to\\dir", NULL); // 无权限参数

3. 系统调用与函数原型

  • Linux/Unix
    • 系统调用:mkdir(const char *pathname, mode_t mode);
    • 需包含头文件 <sys/stat.h><sys/types.h>
  • Windows
    • WinAPI 使用 CreateDirectoryCreateDirectoryExc BOOL CreateDirectory(LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
    • 需包含头文件 <windows.h>
    • 注意:Windows 的 _mkdir(来自 <direct.h>)是兼容 POSIX 的简化版本,但不支持权限设置。

4. 错误处理

  • Linux/Unix
    • 失败时返回 -1 并设置 errno(如 EEXIST 目录已存在、EACCES 无权限)。
    • 示例检查错误: c if (mkdir("/path/to/dir", 0755) == -1) { perror("mkdir failed"); }
  • Windows
    • CreateDirectory 返回 0 表示失败,需调用 GetLastError() 获取错误码(如 ERROR_ALREADY_EXISTS)。
    • 示例: c if (!CreateDirectory("C:\\path\\to\\dir", NULL)) { DWORD err = GetLastError(); fprintf(stderr, "Error: %d\n", err); }

5. 符号链接行为

  • Linux/Unix
    • 若路径中包含符号链接,默认情况下会解析链接并在目标位置创建目录。
  • Windows
    • 对符号链接(或 Junction Points)的处理取决于 API 版本和标志,行为可能不同。

6. 跨平台开发建议

  • 使用 条件编译 处理差异: c #ifdef _WIN32 #include <windows.h> #define mkdir(path, mode) CreateDirectory(path, NULL) #else #include <sys/stat.h> #include <sys/types.h> #endif
  • 或使用跨平台库(如 Boost.Filesystem、C++17 的 <filesystem>)。

总结表

特性 Linux/Unix Windows
路径分隔符 / \(兼容 /
权限控制 mode_t 参数 依赖父目录/安全描述符
函数原型 mkdir(path, mode) CreateDirectory(path, attr)
错误码 errno GetLastError()
符号链接处理 默认解析 依赖 API 行为

如果需要编写跨平台代码,建议封装底层系统调用或使用高级库(如 Qt、Python 的 os.mkdir)来屏蔽差异。