在linux中,目录也是一种文件,对目录的操作可以像对文件操作一样简单。
获得当前的目录
#include <unistd.h>
char * getcwd(char *buf, size_t size);
getcwd函数将当前目录存放到size大小的buf中,如果buf的大小不够放下当前的目录字符串,就会返回NULL,并设置errno为ERANGE,若buf为NULL,而且size的大小为0,那么,getcwd函数会申请空间,并将该空间的的首地址返回,在使用这种方式的时候,要注意及时的释放内存,以避免出现内存泄露的问题。
改变当前目录
#include <unistd.h>
int chdir(const char *path);
int fchdir(int fd);
他们都是用来改变当前的目录的函数,fchdir的参数是一个文件描述符。
创建和删除目录
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int mkdir(const char * pathname, mode_t mode);
int rmdir(const char * pathname);
成功返回0,失败返回-1,并设置errno变量,注意rmdir只可以删除空目录。
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("In (%s)\n", getcwd(NULL, 0));
if (0 > mkdir("test123", 0764)) /*建立文件夹*/
{
perror("mkdir error");
exit(EXIT_FAILURE);
}
system("ls -l");
if (0 > chdir("./test123")) /*进入刚建立的文件夹*/
{
perror("chdir:");
exit(EXIT_FAILURE);
}
printf("In (%s)\n", getcwd(NULL, 0));
system("touch test && ls -l");
chdir("../"); /*返回上层文件夹*/
printf("In (%s)",getcwd(NULL, 0));
if (0 > rmdir("test123")) /*此时因为文件夹能有test文件,会删除失败*/
{
perror("You can't delete the test\n");
}
remove("./test123/test"); /*删除test文件*/
if (0 > rmdir("test123")) /*重新删除文件夹*/
{
perror("You can't delete the test\n");
exit(EXIT_FAILURE);
}
system("ls");
return 0;
}
当在适当的地方加入getchar()的时候,就可以打开文件夹观察变化。
读出目录的内容
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name); /*打开一个目录文件,如果出错返回NULL。并设置errno*/
struct dirent *readdir(DIR *dir); /*从文件中读出一条目录项,注意,该函数会产生覆盖,读到末尾时返回NULL*/
int rewinddir(DIR*dir); /*返回到目录文件头*/
int closedir(DIR* dir); /*关闭目录文件*/
struct dirent {
ino_t d_ino; /* inode number */
off_t d_off; /* offset to the next dirent */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file */
char d_name[256]; /* filename */
};
例如一个简单的ls:
#include <dirent.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
DIR *dir;
struct dirent * dirmsg;
if (NULL == (dir = opendir(argv[1])))
{
perror("open firection error:");
exit(EXIT_FAILURE);
}
while (NULL != (dirmsg = readdir(dir)))
{
puts(dirmsg->d_name);
}
closedir(dir);
return 0;
}
运行一下:./a.out .
test.c
.
..
a.out
目录操作
最新推荐文章于 2023-05-30 07:16:57 发布