c语言系统函数——目录操作
一、 文件夹的系统函数
1.mkdir(),创建一个目录文件。
int mkdir(const char *pathname, mode_t mode);
第一个参数是路径,第二个参数是权限,一般为0777.
在shell命令中,使用mkdir可以创建一个目录,如果使用mkdir aa/bb/cc创建目录,而aa不存在时,可以使用mkdir aa/bb/cc -p;
如果使用mkdir函数来创建,需要一个一个的创建。
2.access()检查是否具有某些权限,是否存在,是否有读写运行的权限等。
int access(const char *pathname, int mode);
返回:如果具有这个权限返回0,没有或者异常返回-1.
3.opendir(),打开一个目录文件
DIR *opendir(const char *name);
DIR *fdopendir(int fd);
函数返回一个DIR的指针。
4.readdir();读取目录下面的文件
struct dirent *readdir(DIR *dirp);
返回的结果是一个结构体。
struct dirent {
ino_t d_ino; /* inode 编号 */
off_t d_off; /* offset to the next dirent */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported
by all file system types */
char d_name[256]; /* 文件名称*/
};
其中文件的类型有:1.DT_REG普通文件 2.DT_LIK符号链接 3.DT_DIR目录文件 4.DT_FIFO管道文件
如果返回NULL说明遍历完了。
例题:
1.使用系统调用完成mkdir实现建立xx/yy/zz
2.完成命令ls
3.完成文件夹的复制
一 、mkdir的实现。#include <sys/stat.h> #include <sys/types.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h>//仿写mkdir命令 //输入的如果是x/y/z;而x并不存在,就会一个一个的创建 //核心是分割字符串int main(int argc,char *argv[]) {argv[1];//对argv[1]进行分割char * p = strtok(argv[1],"/");int erro = 0;char * path = (char *)malloc(256);strcpy(path,p);printf("%s\n",path);if(access(path,F_OK) != 0){erro = mkdir(path ,0777);if(erro == -1){perror("mkdir");return -1;}}while(1){p = strtok(NULL,"/");if(p == NULL){break ;}sprintf(path,"%s/%s",path,p);printf("%s\n",path);if(access(path,F_OK) == 0){//存在这个目录,不需要创建。 }else{erro = mkdir(path ,0777);if(erro == -1){perror("mkdir");return -1;}}}return 0; }ls的实现#include <sys/types.h> #include <dirent.h> #include <stdio.h>int main(int argc,char *argv[]) {DIR *dir = opendir(argv[1]);if(NULL == dir){perror("opendir");return ;}//使用路径打开文件。while(1){struct dirent * str_dir = readdir(dir);if(NULL == str_dir){break;}if(strcmp(".",str_dir->d_name) == 0 || 0 == strcmp("..",str_dir->d_name)){break;}printf("%s\n",str_dir->d_name);}return 0; }拷贝目录#include <stdio.h> #include <sys/types.h> #include <dirent.h>//opendir的头文件 //readdir的头文件 #include <sys/stat.h>#include <fcntl.h>//open需要的头文件 #include <string.h> #include <errno.h> //errno的头文件 #include <stdlib.h> #include <unistd.h> //close的头文件int main(int argc,char *argv[]) {//打印一个文件夹下的各种文件。/*DIR * folder = opendir(argv[1]);if(NULL == folder){perror("open");return -1;}while(1){struct dirent * dir = readdir(folder);if(NULL == dir){break;}printf("%s\n",dir->d_name);}*/if(access(argv[2],F_OK) == -1){mkdir(argv[2],0777);}//如果文件不存在,就创建一个文件。swap(argv[1],argv[2]);return 0; }int swap(char * source,char *destination) {DIR * sourDir = opendir(source);if(source == NULL){perror("openDir");return -1;}//遍历目录,如果发现是普通文件就直接复制,目录文件就递归调用while(1){struct dirent *dir = readdir(sourDir);if(NULL == dir){break;}/*if( 0 == strncmp(dir->d_name,".",1)){continue;}*/if(DT_DIR == dir->d_type){//去除..和.if(strcmp(dir->d_name,"..") == 0 || strcmp(dir->d_name,".") == 0){//printf("%s\n\n",dir->d_name);continue;}char sourceDir[256] = {'\0'};char destinationDir[256] = {'\0'};sprintf(sourceDir,"%s/%s",source,dir->d_name);sprintf(destinationDir,"%s/%s",destination,dir->d_name);if(access(destinationDir,F_OK) == -1){int ret = mkdir(destinationDir,0777);if(ret == -1){printf("出错%s\n",destinationDir);perror("mkdir");return -1;}} swap(sourceDir,destinationDir);}else{//需要使用一个copy的命令命令char sourceDir[256] = {'\0'};char destinationDir[256] = {'\0'};sprintf(sourceDir,"%s/%s",source,dir->d_name);sprintf(destinationDir,"%s/%s",destination,dir->d_name);printf("%s\n",sourceDir);printf("%s\n",destinationDir);copy(sourceDir,destinationDir);//复制文件。 }}return 1; }//拷贝一个文件,如果成功就会返回1,否则就会返回-1. int copy(char * p1 ,char * p2) {int fd = -1 ;int fd2 = -1;fd = open(p1,O_RDONLY);if(-1 == fd){perror("open1");//exit(EXIT_FAILURE);return -1;}fd2 = open(p2,O_WRONLY|O_CREAT,0664);if(-1 == fd2){perror("open2");//exit(EXIT_FAILURE);return -1;}while(1){char x[256];ssize_t ret =-1;ret = read(fd,x,256);if(ret == -1){perror("read");return -1;}if(ret == 0){break;}ret = write(fd2,x,ret);if(ret == -1){perror("write");return -1;}}close(fd);close(fd2);return 1; }
转载于:https://www.cnblogs.com/qiny1012/p/8405394.html
c语言系统函数——目录操作相关推荐
- c语言得到系统的函数,c语言系统函数(C language system function).doc
c语言系统函数(C language system function) c语言系统函数(C language system function) Mathematical function " ...
- Linux系统常用目录操作函数
参考<Linux程序设计>第二版P103 扫描目录: #include <stdio.h> #include <stdlib.h> #include <str ...
- 自己写代码实现C语言系统函数strcat
我们在面试的时候,经常会被笔试实现系统函数,比如strcat函数,主要考察大家的C语言功底! 下面黄强老师带领大家实现一下: #include <stdio.h> #include < ...
- 使用c语言创建4个进程,c语言系统函数——进程的创建
一 . 进程的创建 1.fork();创建一个独立的进程 pid_t fork(void); 使用这个命令会创建一个独立于父进程而且拷贝父进程全部存储空间的子进程 返回值有三种情况 1.父进程会返回子 ...
- c语言Clipboard函数,剪贴板操作 Clipboard API 教程
一.简介 浏览器允许 JavaScript 脚本读写剪贴板,自动复制或粘贴内容. 一般来说,脚本不应该改动用户的剪贴板,以免不符合用户的预期.但是,有些时候这样做确实能够带来方便,比如"一键 ...
- Python系统函数文件操作
一.文件 用open创建文件 import os fout = open('ops.txt', 'wt') fout.close() 用exists()检查文件或目录是否存在 传入绝对路径或者相对路径 ...
- C语言系统函数Sqrt的实现[输入字符串]
// MySqrt.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h"float mySqrt(char*n,int size){if (n[0] ...
- Linux命令【五】系统函数
系统文件函数 stat函数 指针如果没有const一般表示传出参数,如果加const表示传入参数 struct stat dev_t st_dev文件设备编号 ino_t st_ino节点 inode ...
- windows c语言目录操作函数,c语言目录操作在C/C++语言中如何进行目录操作,如得到目录内的 爱问知识人...
这里给你提供一些C的目录操作函数,原型声明所在头文件为dir.h.dos.h,仅供参考: int chdir(char *path) 使指定的目录path(如:"C:\\WINDOWS&qu ...
最新文章
- 【sping揭秘】6、IOC容器之统一资源加载策略
- 深度学习发现古人类遗址,AI 考古比胡八一更高效
- generate random or regular test data in R
- docker 启动mongodb
- 超全流程-idea对springboot+ssm的部署实现增删改查
- 任何一个正整数都可以用2的幂次方表示(C语言版)
- 分布式是写出来的(一)
- gcc生成的汇编和keil生成的汇编_Linux编译工具:gcc入门
- hencoder学习自定义view(1)
- python-pygame安装教程
- ElasticSearch安装
- 【SSL证书】如何使用 FreeSSL (V2.8.0) 申请免费证书及安装
- Visual Studio Code——做嵌入式C/C++开发常用的编辑器软件安装及基本使用总结
- 【一起学习输入法】华宇拼音输入法开源版本解析(1)
- 1.23英文题面翻译
- 什么是低代码-甲骨文对低代码的定义
- 在PCB中快速找到原理图的原件
- 中鑫吉鼎|你知道自己理财期间这四个更重要吗
- Git 经验总结及 Git GitHub 学习指南
- 字符串翻译python_字符串的这个东西-翻译表