目录IO(man)

1、基本概念

• linux中一切皆文件!
– 目录、软链接、硬链接以及前面介绍的普通文件、设备节点等,都可以理解为文件
– 目录管理和普通文件稍微有点不同,不过具有高度的相似

• 索引号(inode)
– 一个文件对应一个索引号inode,inode是文件系统提供的唯一数值编址,这个数值叫inode编号(索引号)
– 使用命令" ls -i “” ls -al “” ls -ail "可以查看索引号等元数据
– inode中存储了与文件相关的元数据。

2、stat 函数组

man stat

• 函数int stat(const char *path, struct stat buf);
– 参数
path:文件路径
– 参数 buf:文件信息
– 返回值:成功为0,否则为-1

• 函数int fstat(int fd, struct stat buf);
– 参数fd:文件描述符
– 参数
buf:文件信息
– 返回值:成功为0,否则为-1
• 函数int lstat(const char *path, struct stat buf);
– 参数
path:文件路径
– 参数 buf:返回文件的信息,针对符号链接,lstat 返回链接本身,而不是而非目标文件
– 返回值:成功为0,否则为-1

stat.c

#include <stdio.h>
//通过man文档可以查看到stat函数组头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

//open函数的参数头文件
#include <fcntl.h>

int main(int argc,char *argv[])
{
	struct stat groupstat;
	int fd,ret;
	
	if(argc <2){
		printf("\nPlease input file path\n");
		return 1;
	}

//stat函数测试	
	ret = stat(argv[1],&groupstat);
	if(ret){
		printf("Please make sure file path\n");
		return 1;
	}
	printf("stat function test , %s of st_ino inode is %ld\n",argv[1],groupstat.st_ino);
	
//fstat函数测试
	fd = open(argv[1],O_RDWR|O_NOCTTY|O_NDELAY);
	if(fd<0)
	{
		printf("Please make sure file path\n");
		return 1;
	}
	ret = fstat(fd,&groupstat);
	if(ret){
		printf("Please make sure file path\n");
		return 1;
	}
	printf("fstat function test , %s of st_ino inode is %ld\n",argv[1],groupstat.st_ino);
	
//lstat函数测试	
	ret = lstat(argv[1],&groupstat);
	if(ret){
		printf("Please make sure file path\n");
		return 1;
	}
	printf("lstat function test , %s of st_ino inode is %ld\n",argv[1],groupstat.st_ino);

	return 0;
}

3、chmod权限

man 2 chmod

• int chmod(const char path, mode_t mode);
– 参数
path:文件路径。
– 参数mode:直接使用数字即可。和前面命令中chmod 777 xxx 中的777 这个参数含义类似,也可以使用文档中的组合值。
– 返回值:成功返回0,错误返回-1。

• int fchmod(int fd, mode_t mode);
– 参数fd:文件描述符。
– 参数mode:直接使用数字即可。和前面命令中chmod 777 xxx 中的777 这个参数含义类似,也可以使用文档中的组合值。
– 返回值:成功返回0,错误返回-1。

chmod.c

#include <stdio.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc,char *argv[])
{
	int fd,ret;
	
	if(argc <3){
		printf("\nPlease input file path\n");
		return 1;
	}
	
//chmod函数测试	
	ret = chmod(argv[1],0777);
	if(ret<0){
		printf("Please make sure file path\n");
		return 1;
	}
	printf("chmod %s 0777 is success!\n",argv[1]);

//fchmod函数测试		
	fd = open(argv[2],O_RDWR|O_NOCTTY|O_NDELAY);
	if(fd<0)
	{
		printf("Please make sure file path\n");
		return 1;
	}
	ret = fchmod(fd,0555);
	if(ret<0){
		printf("Please make sure file path\n");
		return 1;
	}
	printf("fchmod %s 0555 is success!\n",argv[1]);
	
	return 0;
}

4、获取当前目录

man 3 getcwd

• char *getcwd(char buf, size_t size);
– 参数
buf:保存当前目录的缓冲区
– 参数size:在现代linux 中,buf 的长度至少可以为255 字节
– 返回值:成功返回指向当前目录的指针,和buf 的值一样,错误返回NULL

• char *getwd(char buf);该函数已经过时,使用的时候会有警告
– 参数
buf:保存当前目录的缓冲区
– 返回值:成功返回指向当前目录的指针,和buf 的值一样,错误返回NULL
• char *get_current_dir_name(void);
– 参数:无
– 返回值:成功返回指向当前目录的指针,错误返回NULL

#include <stdio.h>
/*getcwd、getwd和get_current_dir_name
函数的头文件*/
#define __USE_GNU
#include <unistd.h>

#define LENTH 255
int main()
{
	char pwd[LENTH];
	char *wd;
//getcwd函数测试		
	if(!getcwd(pwd,LENTH)){
		perror("getcwd");
		return 1;
	}
	printf("\ngetcwd pwd is %s\n",pwd);
	
//getwd函数测试
	wd = getwd(pwd);
	if(!wd){
		perror("getcwd");
		return 1;
	}
	printf("\ngetwd pwd is %s\n",wd);
	
//get_current_dir_name函数测试	
	wd = get_current_dir_name();
	if(!wd){
		perror("getcwd");
		return 1;
	}
	printf("\nget_current pwd is %s\n",wd);
	
	return 0;
}

5、mkdir

#include <stdio.h>
//mkdir函数头文件
#include <sys/stat.h>
#include <sys/types.h>

int main(int argc,char *argv[])
{
	int ret;
		
//检测参数	
	if(argc <2){
		printf("\nPlease input file path\n");
		return 1;
	}
//使用mkdir函数新建目录
	ret = mkdir(argv[1],0777);
	if(ret<0){
		printf("mkdir %s failed!\n",argv[1]);
		return 1;
	}
	printf("mkdir %s suceces!\n",argv[1]);
	
	return 0;
}

6、rmdir

#include <stdio.h>
//rmdir函数头文件
#include <unistd.h>

int main(int argc,char *argv[])
{
	int ret;
		
//检测参数	
	if(argc <2){
		printf("\nPlease input file path\n");
		return 1;
	}
//使用rmdir函数删除目录
	ret = rmdir(argv[1]);
	if(ret<0){
		printf("rmdir %s failed!\n",argv[1]);
		return 1;
	}
	printf("rmdir %s suceces!\n",argv[1]);
	
	return 0;
}

7、chdir

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//chdir和fchdir函数头文件
#include <unistd.h>

#define LENTH 255

int main(int argc,char *argv[])
{
	int ret;
	char pwd[LENTH];

//检测参数	
	if(argc <3){
		printf("\nPlease input file path\n");
		return 1;
	}
	
//getcwd函数获取当前目录		
	if(!getcwd(pwd,LENTH)){
		perror("getcwd");
		return 1;
	}
	printf("\ngetcwd pwd is %s\n",pwd);
	
//使用chdir函数转入其他目录
	ret = chdir(argv[1]);
	if(ret){
		printf("Please make sure file path\n");
		return 1;
	}
	printf("chdir %s is success!\n",argv[1]);
	
//转入其他目录,完成操作
//使用rmdir函数删除目录
	ret = rmdir(argv[2]);
	if(ret<0){
		printf("rmdir %s failed!\n",argv[2]);
		return 1;
	}
	printf("rmdir %s is success!\n",argv[2]);
	
//再次使用chdir回到pwd保存的目录
	ret = chdir(pwd);
	if(ret){
		printf("Please make sure file path\n");
		return 1;
	}
	printf("chdir %s is success!\n",pwd);

	return 0;
}

8、opendir

#include <stdio.h>
//opendir和closedir函数头文件
#include <dirent.h>
#include <sys/types.h>

int main(int argc,char *argv[])
{
	int ret;
	DIR *dir;
	
//检测参数	
	if(argc <2){
		printf("\nPlease input file path\n");
		return 1;
	}
//使用opendir函数打开目录
	dir = opendir(argv[1]);
	if(dir==NULL){
		printf("opendir %s failed!\n",argv[1]);
		return 1;
	}
	printf("opendir %s suceces!\n",argv[1]);
//使用closedir函数关闭目录
	closedir(dir);
	
	return 0;
}

9、readdir

#include <stdio.h>
//opendir,closedir,readdir函数头文件
#include <dirent.h>
#include <sys/types.h>

int main(int argc,char *argv[])
{
	int ret;
	DIR *dir;
	struct dirent *catlog;
//检测参数	
	if(argc <2){
		printf("\nPlease input file path\n");
		return 1;
	}
//使用opendir函数打开目录
	dir = opendir(argv[1]);
	if(dir==NULL){
		printf("opendir %s failed!\n",argv[1]);
		return 1;
	}
	printf("opendir %s suceces!\n",argv[1]);
//使用readdir读取目录argv[1]
	catlog = readdir(dir);
	if(catlog == NULL){
		printf("readdir %s failed!\n",argv[1]);
		return 1;
	}
	printf("%s d_ino is %ld\n ",argv[1],catlog->d_ino);
//使用closedir函数关闭目录
	closedir(dir);
	
	return 0;
}

10、硬链接 link

• 硬链接命令为ln,函数为link
• man 2 link
• 硬链接函数
• int link(const char *oldpath, const char * newpath);
– 参数 * oldpath:已有的文件路径。
– 参数 * newpath:新建的硬链接文件路径。
– 返回值:成功返回0,错误返回-1。

link.c

#include <stdio.h>
//link函数头文件
#include <unistd.h>

int main(int argc,char *argv[])
{
	int ret;
	
	if(argc <3){
		printf("\nPlease input file path\n");
		return 1;
	}

//测试link函数
	ret = link(argv[1],argv[2]);
	if(ret)
	{
		printf("link failed");
		return 1;
	}
	printf("link %s to %s success!\n",argv[1],argv[2]);
	
	return 0;
}

11、符号链接 symlink

• 符号链接也叫软链接,symlink
• man 2 symlink
• 软链接函数
• int symlink(const char oldpath, const char newpath);
– 参数
oldpath:已有的文件路径
– 参数
newpath:新建的符号链接文件路径
– 返回值:成功返回0,错误返回-1

symlink.c

#include <stdio.h>
//symlink函数头文件
#include <unistd.h>

int main(int argc,char *argv[])
{
	int ret;
	
	if(argc <3){
		printf("\nPlease input file path\n");
		return 1;
	}

//测试symlink函数
	ret = symlink(argv[1],argv[2]);
	if(ret)
	{
		printf("symlink failed");
		return 1;
	}
	printf("symlink %s to %s success!\n",argv[1],argv[2]);
	return 0;
}

12、解除链接 unlink

• 解除链接unlink
• man 2 unlink
• 解除链接函数
• int unlink(const char pathname);
– 参数
pathname:链接文件的路径
– 返回值:成功返回0,错误返回-1
– unlink指向软链接,删除软链接;指向最后一个硬链接,相当于删除文件

#include <stdio.h>
//unlink函数头文件
#include <unistd.h>

int main(int argc,char *argv[])
{
	int ret;
	
	if(argc <2){
		printf("\nPlease input file path\n");
		return 1;
	}

//测试unlink函数
	ret = unlink(argv[1]);
	if(ret)
	{
		printf("unlink failed");
		return 1;
	}
	printf("unlink %s is success!\n",argv[1]);
	
	return 0;
}

13、拷贝文件

cpfile.c

#include <stdio.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

//argv[1] is oldpath ; argv[2] is newpath
#define LENTH 1024
int main(int argc,char *argv[])
{
	int fds,fdt;
	char buffer[LENTH];
	char *fileold,*filenew;
	
	fileold = argv[1];
	filenew = argv[2];
	
	if(argc <3){
		printf("\nPlease input file path\n");
		return 1;
	}

	//打开oldpath		
	fds = open(fileold,O_RDWR);
	if(fds<0)
	{
		printf("Please make sure file path\n");
		return 1;
	}
	
	//打开newpath,如果没有则创建目标文件
	fdt = open(filenew,O_WRONLY|O_CREAT);
	if(fdt<0)
	{
		printf("Please make sure file path\n");
		return 1;
	}

	//读和写操作
	while(read(fds,buffer,LENTH)){
		write(fdt,buffer,strlen(buffer));
	}
	
	//关闭文件
	close(fds);
	close(fdt);
	
	printf("cp to finished!\n");
	printf("cp %s to %s success!\n",fileold,filenew);
	return 0;
}

14、移动文件

• 移动文件命令为mv,函数为rename
• man 2 rename
• int rename(const char oldpath, const char newpath)
– 参数
oldpath:旧的文件路径
– 参数
newpath:新的文件路径
– 返回值:成功返回0,错误返回-1

rename.c

#include <stdio.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

//argv[1] is oldpath ; argv[2] is newpath
int main(int argc,char *argv[])
{
	int ret;
	if(argc < 3){
		printf("\nPlease input file path\n");
		return 1;
	}
	if(ret = rename(argv[1],argv[2])){
		printf("\nerr\n");
	}
		
	printf("rename %s to %s success!\n",argv[1],argv[2]);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值