在Linux系统中创建新目录
- 系统调用:通常使用
mkdir
系统调用,在C语言中其原型为 int mkdir(const char *pathname, mode_t mode);
。pathname
是要创建目录的路径名,mode
用于指定新目录的权限。例如:
#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
const char *dirname = "new_directory";
mode_t mode = 0755;
int ret = mkdir(dirname, mode);
if (ret == -1) {
perror("mkdir");
exit(EXIT_FAILURE);
}
return 0;
}
- 数据结构变化:
- 目录项:文件系统会在父目录的目录项列表中添加一个新的目录项,该目录项记录了新目录的文件名以及其对应的inode号。
- inode:文件系统为新目录分配一个新的inode,inode中记录了该目录的元数据信息,如文件类型(目录类型)、权限、所有者、大小(通常初始为0,随着子目录和文件的添加而改变)、时间戳等。
- 块分配:文件系统会为新目录分配至少一个数据块,用于存储该目录下的目录项列表(即使当前为空目录)。
- 权限检查:
- 调用进程权限:调用
mkdir
的进程必须具有父目录的写权限,因为需要在父目录中添加新的目录项。如果进程没有父目录的写权限,mkdir
系统调用将失败并返回错误,例如 EACCES
错误。
- umask影响:系统的umask值会影响新目录实际创建的权限。新目录的权限是
mode & ~umask
。例如,如果 mode
是 0755
,umask是 0022
,那么实际创建的目录权限是 0755 & ~0022 = 0733
。
在Windows系统中创建新目录
- 系统调用:在Windows API中,使用
CreateDirectory
函数来创建新目录。其原型为 BOOL CreateDirectory(LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
。lpPathName
是要创建目录的路径,lpSecurityAttributes
用于指定新目录的安全属性,如果为 NULL
,则使用默认的安全属性。例如:
#include <windows.h>
#include <stdio.h>
int main() {
LPCTSTR dirname = TEXT("new_directory");
BOOL ret = CreateDirectory(dirname, NULL);
if (!ret) {
DWORD error = GetLastError();
printf("CreateDirectory failed with error %d\n", error);
return 1;
}
return 0;
}
- 数据结构变化:
- MFT(主文件表):NTFS文件系统(Windows常用文件系统)使用MFT来记录文件和目录的信息。创建新目录时,会在MFT中分配一个新的记录项,记录新目录的文件名、属性(如文件类型为目录)、安全描述符等信息。
- 索引分配:NTFS会为目录分配索引结构(类似B+树),用于存储目录下的文件和子目录的信息。即使是一个空目录,也会有相应的索引结构。
- 权限检查:
- 调用进程权限:调用
CreateDirectory
的进程必须具有父目录的 FILE_ADD_SUBDIRECTORY
访问权限。如果进程没有该权限,函数将失败并通过 GetLastError
返回错误码,如 ERROR_ACCESS_DENIED
。
- 安全描述符:新目录的安全描述符决定了后续对该目录的访问权限。如果
lpSecurityAttributes
为 NULL
,新目录将继承父目录的安全描述符,这意味着从父目录继承权限设置。