Linux目錄遍歷主要分為三步
- 打開(kāi)目錄
- 讀取目錄
-
關(guān)閉目錄
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#define args_check(argc,num) {if(argc!=num) {printf("error args\n");return -1;}}
//目錄深度優(yōu)先遍歷
void printdir(char * dirname,int width) //遞歸調(diào)用自己
{
DIR *pdir; //定義DIR類型變量這是opendir的返回值
pdir=opendir(dirname); //打開(kāi)目錄
if(NULL==pdir) //若傳參不正確
{
perror("opendir"); //返回opdir錯(cuò)誤在哪里
return;
}
struct dirent *p; //定義dirent類型指針為了獲取某文件夾目錄內(nèi)容,所使用的結(jié)構(gòu)體
char path[512]={0}; //定義目錄字符串
while((p=readdir(pdir))!=NULL) //readdir讀取目錄的返回值為一個(gè)dirent類型的指針
{
if(!strcmp(p->d_name,".")||!strcmp(p->d_name,".."))
{
continue; //跳過(guò)當(dāng)前目錄和上一級(jí)目錄余佃,避免無(wú)限循環(huán)
}
printf("%*s%s\n",width,"",p->d_name); //printf 打印空格
if(p->d_type==4) //d_type的枚舉類型值表示一個(gè)類型4是目錄,0是未知,1是管道,2是字符設(shè)備,8表示文件,6是塊設(shè)備
{
sprintf(path,"%s%s%s",dirname,"/",p->d_name);//sprintf將三個(gè)字符串拼接起來(lái)
printdir(path,width+4); //遞歸調(diào)用自己旷太,下一層目錄前面打印空格多4個(gè)
}
}
closedir(pdir);
}
int main(int argc,char *argv[])
{
args_check(argc,2); //此處定義為宏,判斷傳入?yún)?shù)
printf("%s\n",argv[1]); //打印傳入目錄
printdir(argv[1],4); //調(diào)用遞歸函數(shù)
return 0;
}
磁盤(pán)刪除只是刪除了dirent信息 除非下一次再寫(xiě)入文件到那個(gè)位置的時(shí)候就會(huì)
文件剪切只是創(chuàng)建了一個(gè)硬鏈接和copy有很大不同,速度快的多