首页 > 其他分享 >C语言目录操作

C语言目录操作

时间:2022-11-22 22:36:19浏览次数:43  
标签:文件 name int stdinfo C语言 char 操作 目录


文章目录

  • ​​一、获取当前工作目录​​
  • ​​二、切换工作目录​​
  • ​​三、目录的创建和删除​​
  • ​​四、获取目录中的文件列表​​
  • ​​1、包含头文件​​
  • ​​2、相关的库函数​​
  • ​​3、数据结构​​
  • ​​4、读取目录​​
  • ​​五、应用经验​​
  • ​​六、课后作业​​
  • ​​七、获取视频教程​​
  • ​​八、版权声明​​


目录的操作不论是在嵌入式还是应用软件编程都是必不可少的,不同的开发语言可能略有不同,本章节主要是讨论在Linux系统下目录的一系列操作,以我的个人经验,创建目录和列出目录中的文件这两个功能用得最多。

一、获取当前工作目录

在shell中我们可以直接输入命令pwd来显示当前的工作目录,在C程序中调用getcwd函数可以获取当前的工作目录。函数声明:

char * getcwd(char * buf,size_t size);

getcwd函数把当前工作目录存入buf中,如果目录名超出了参数size长度,函数返回NULL,如果成功,返回buf。例如:

char strpwd[301];
memset(strpwd,0,sizeof(strpwd))
getcwd(strpwd,300);
printf("当前目录是:%s\n",strpwd);

二、切换工作目录

函数声明:

int chdir(const char *path);

就像我们在shell中使用cd命令切换目录一样,在C程序中使用chdir函数来改变工作目录。

返回值:0-切换成功;非0-失败。

三、目录的创建和删除

在shell中可以通过mkdir/rmdir命令来创建/删除目录,C程序中用mkdir/rmdir函数来创建/删除目录。

创建目录函数的声明:

int mkdir(const char *pathname, mode_t mode);

mode的含义将按open系统调用的O_CREAT选项中的有关定义设置,当然,它还要服从umask的设置况,是不是看不明白?那先固定填0755,注意,0不要省略哦,它表示八进制。 例如:

mkdir("/tmp/aaa",0755);   // 创建/tmp/aaa目录

删除目录函数的声明:

int rmdir(const char *pathname);

四、获取目录中的文件列表

在实际开发中,文件是存放在目录中的,在处理文件之前,必须先知道目录中有哪些文件,所以要获取目录中的文件列表。涉及到的库函数如下:

1、包含头文件

#include <dirent.h>

2、相关的库函数

打开目录的函数opendir的声明:

DIR *opendir(const char *pathname);

读取目录的函数readdir的声明:

struct dirent *readdir(DIR *dirp);

关闭目录的函数closedir的声明:

int closedir(DIR *dirp);

3、数据结构

1)目录指针DIR

DIR *目录指针名;

2)struct dirent结构体

每调用一次readdir函数会返回一个struct dirent的地址,存放了本次读取到的内容,它的原理与fgets函数读取文件相同。

struct dirent
{
long d_ino; // inode number 索引节点号
off_t d_off; // offset to this dirent 在目录文件中的偏移
unsigned short d_reclen; // length of this d_name 文件名长
unsigned char d_type; // the type of d_name 文件类型
char d_name [NAME_MAX+1]; // file name文件名,最长255字符
};

我们只需要关注结构体的d_type和d_name成员,其它的不必关心。

d_name文件名或目录名。

d_type描述了文件的类型,有多种取值,最重要的是8和4,8-常规文件(A regular file);4-目录(A directory),其它的暂时不关心。

4、读取目录

示例(book123.cpp)

/*
* 程序名:book123.c,此程序用于演示读取目录下的文件名信息
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <dirent.h>

int main(int argc,char *argv[])
{
if (argc != 2) { printf("请指定目录名。\n"); return -1; }

DIR *dir; // 定义目录指针

// 打开/tmp目录
if ( (dir=opendir(argv[1])) == 0 ) return -1;

// 用于存放从目录中读取到的文件和目录信息
struct dirent *stdinfo;

while (1)
{
// 读取一条记录并显示到屏幕
if ((stdinfo=readdir(dir)) == 0) break;

printf("name=%s,type=%d\n",stdinfo->d_name,stdinfo->d_type);
}

closedir(dir); // 关闭目录指针
}

运行效果

C语言目录操作_c++

五、应用经验

在实际开发中,对目录的操作并不会像book123.c那样简单。

实际需求是这样的,文件存放在某目录中,该目录下还会有多级子目录,程序员想要的是列出该目录及其子目录下全部的文件名。

例如存在/home/wucz/tmp目录,其子目录结构和文件如下:

C语言目录操作_c++_02

示例(book124.c)

/*
* 程序名:book124.c,此程序用于演示读取目录及其子目录下全部的文件信息
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <dirent.h>

// 列出目录及子目录下的文件
int ReadDir(const char *strpathname);

int main(int argc,char *argv[])
{
if (argc != 2) { printf("请指定目录名。\n"); return -1; }

// 列出目录及子目录下的文件
ReadDir(argv[1]);
}

// 列出目录及子目录下的文件
int ReadDir(const char *strpathname)
{
DIR *dir; // 定义目录指针
char strchdpath[256]; // 子目录的全路径

if ( (dir=opendir(strpathname)) == 0 ) return -1; // 打开目录

struct dirent *stdinfo; // 用于存放从目录读取到的文件和目录信息

while (1)
{
if ((stdinfo=readdir(dir)) == 0) break; // 读取一记录

if (strncmp(stdinfo->d_name,".",1)==0) continue; // 以.开始的文件不读

if (stdinfo->d_type==8) // 如果是文件,显示出来
printf("name=%s/%s\n",strpathname,stdinfo->d_name);

if (stdinfo->d_type==4) // 如果是目录,再调用一次ReadDir
{
sprintf(strchdpath,"%s/%s",strpathname,stdinfo->d_name);
ReadDir(strchdpath);
}
}

closedir(dir); // 关闭目录指针
}

运行效果

C语言目录操作_c语言_03

这才是程序员想要的结果。

在某些C语言的教材里,有递归函数这个概念,在我的教程里,没有讲这个概念,实际上,book124.c的ReadDir函数就是一个递归函数,在ReadDir函数中调用了自身。

六、课后作业

编写示例程序,把本章节介绍的知识点全部演示一遍,用程序演示可以加深您的理解和映象。

七、获取视频教程

八、版权声明

作者:码农有道

如果文章有错别字,或者内容有错误,或其他的建议和意见,请您留言指正,非常感谢!!!


标签:文件,name,int,stdinfo,C语言,char,操作,目录
From: https://blog.51cto.com/u_13748800/5878566

相关文章

  • C语言目录和文件操作扩展
    文章目录​​一、access库函数​​​​二、stat库函数​​​​1、stat结构体​​​​2、stat库函数​​​​三、utime库函数​​​​四、rename库函数​​​​五、remove库......
  • C语言时间操作
    文章目录​​一、time_t别名​​​​二、time库函数​​​​三、tm结构体​​​​四、localtime库函数​​​​五、mktime库函数​​​​在这里插入图片描述六、程序睡眠​......
  • C语言获取系统错误
    文章目录​​一、strerror函数​​​​二、errno的细节​​​​1、调用库函数失败不一定会设置errno​​​​2、errno不能作为调用库函数失败的标志​​​​3、程序员可以不......
  • C语言编译预处理
    文章目录​​一、预处理指令​​​​二、包含文件​​​​三、宏定义指令​​​​1、无参数的宏​​​​2、带参数的宏​​​​四、条件编译​​​​1、#ifdef​​​​2、#i......
  • C语言gdb调试
    文章目录​​一、gdb的安装​​​​二、调试前的准备​​​​三、基本调试命令​​​​四、课后作业​​​​五、获取视频教程​​​​六、版权声明​​程序员写在编写程序......
  • C语言makefile文件
    文章目录​​一、makefile的编写​​​​二、make命令​​​​三、makefile文件中的变量​​​​四、应用经验​​​​五、课后作业​​​​六、获取视频教程​​​​七、版......
  • freecplus框架-MySQL数据库操作
    文章目录​​一、源代码说明​​​​二、概述​​​​三、connection类​​​​四、sqlstatement类​​​​五、程序流程​​​​1、无结果集SQL的程序的流程​​​​2、有......
  • freecplus框架-Oracle数据库操作
    文章目录​​一、源代码说明​​​​二、概述​​​​三、connection类​​​​四、sqlstatement类​​​​五、程序流程​​​​1、无结果集SQL的程序的流程​​​​2、有......
  • C语言数据类型
    文章目录​​一、基本类型​​​​1、字符型(char)​​​​2、整型(int)​​​​3、浮点型(float)​​​​二、字符串​​​​三、构造类型​​​​四、指针类型​​​​五、其它......
  • freecplus框架-文件操作
    文章目录​​一、源代码说明​​​​二、文件操作函数​​​​1、删除文件​​​​2、文件重命名​​​​3、复制文件​​​​4、获取文件的大小​​​​5、获取文件的时间......