好的做彩平圖的網(wǎng)站百度手機(jī)助手下載安裝
第一題:預(yù)習(xí) opendir 和 readdir函數(shù)
opendir
?和?readdir
?是兩個(gè)在C語言(特別是使用POSIX標(biāo)準(zhǔn)的系統(tǒng),如Linux和UNIX)中用于目錄遍歷的函數(shù)。這兩個(gè)函數(shù)屬于標(biāo)準(zhǔn)的C庫(kù)中的目錄操作部分,通常與<dirent.h>
頭文件一起使用。下面詳細(xì)介紹這兩個(gè)函數(shù)的作用和用法。
opendir 函數(shù)
opendir
?函數(shù)用于打開一個(gè)目錄流,以便通過?readdir
?函數(shù)讀取目錄內(nèi)容。
函數(shù)原型:
#include <dirent.h>
#include <sys/types.h> DIR *opendir(const char *name);
參數(shù):
name
:指向以null結(jié)尾的字符串的指針,該字符串指定了要打開的目錄的路徑。
返回值:
- 成功時(shí),返回一個(gè)指向
DIR
類型的指針,該指針代表打開的目錄流。 - 失敗時(shí),返回
NULL
,并設(shè)置errno
以指示錯(cuò)誤。
readdir 函數(shù)
readdir
?函數(shù)用于讀取目錄流中的下一個(gè)目錄項(xiàng)。
函數(shù)原型:
#include <dirent.h> struct dirent *readdir(DIR *dirp);
參數(shù):
dirp
:指向之前通過opendir
函數(shù)打開的目錄流的指針。
返回值:
- 成功時(shí),返回一個(gè)指向
dirent
結(jié)構(gòu)的指針,該結(jié)構(gòu)包含目錄項(xiàng)的信息。 - 讀取到目錄末尾或出錯(cuò)時(shí),返回
NULL
。要區(qū)分這兩種情況,可以檢查errno
或使用errno
的包裝函數(shù),如feof(dirfd(dirp))
(但注意,feof
并不直接適用于目錄流,這里只是提供一個(gè)類比)。實(shí)際上,當(dāng)?shù)竭_(dá)目錄末尾時(shí),errno
不會(huì)被設(shè)置。
第二題:通過 opendir、readdir、write、read函數(shù)實(shí)現(xiàn)拷貝一個(gè)文件夾中的所有文件的功能(不考慮文件夾中還有文件夾的情況)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;int main(int argc, const char *argv[])
{if(access(argv[2],F_OK) == -1)//判斷目標(biāo)文件夾是否存在{mkdir(argv[2],0777);//不存在則創(chuàng)建目標(biāo)文件夾}else//如果存在,則需要判斷該文件是否為目錄文件{struct stat buf={0};stat(argv[2],&buf);mode_t mode=buf.st_mode;if(S_ISDIR(mode) != 1){fprintf(stderr,"該文件不是一個(gè)目錄文件!\n");return 1;}}DIR* df=opendir(argv[1]);if(dp == NULL){perror("opendir");return 1;}while(1){struct dirent* dt=readdir(df);if(dt == NULL){break;}if(strcmp(dt->d_name,".")==0 || strcmp(dt->d_name,"..")==0){continue;}chdir(argv[1]);//把工作目錄切換到argv[1]里面int rfd=open(dt->d_name,O_RDONLY);if(rfd == -1){perror("ropen");}chdir("..");//把工作目錄切換到上一級(jí)目錄chdir(argv[2]);int wfd=open(dt->d_name,O_WRONLY | O_CREAT | O_TRUNC,0666);if(wfd == -1){perror("wopen");}chdir("..");while(1){char s[16]={0};int res=read(rfp,s,15);if(res == 0){breaak;}write(wfp,s,strlen(buf));}}close(rfp);close(wfp);closedir(df);return 0;
}