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;
}