카테고리 없음
[Linux/C] 파일 정보 출력하기 (opendir, readdir 활용)
2022. 7. 31. 22:30반응형
설명
아래의 함수를 활용하여, 아래의 [출력화면]과 같이, 파일과 디렉토리를 구분하여 출력하게 끔 하였다.
■ struct dirent
■ DIR *opendir(const char *name);
이 함수는 디렉토리 name 에 따른 디렉토리 스트림을 오픈합니다, 그리고 디렉토리 스트림 포인터를 리턴합니다. 그 스트림은 이 디렉토리의 첫번째 엔트리에 위치합니다.
■ struct dirent *readdir(DIR *dirp);
이 함수는 dirent 구조체 포인터를 반환합니다, 그 포인터는 drip에 의해 위치한 디렉토리 스트림 안에, 다음 디렉토리 엔트리를 가리킵니다. 이것은 NULL을 리턴하는데요, 디렉토리 스트림에 끝 에 도달했을 경우 혹은 에러를 발생시켰을 경우에 NULL을 리턴합니다.
■ int closedir(DIR *dirp);
이 함수는 drip와 관련된 디렉토리 스트림을 닫습니다.
■ strcut stat
■ int stat(const char *pathname, struct stat *statbuf);
■ struct tm
■ strcut tm *localtime(const time_t *timep);
출력화면
코드
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>
#include <stdlib.h>
char* formatdate(char *str, time_t val)
{
strftime(str, 36, "%Y:%m:%d %H:%M:%S", localtime(&val));
return str;
}
int main()
{
DIR *dir_info;
struct dirent *dir_entry;
int return_stat;
char *file_name;
struct stat file_info;
mode_t file_mode;
struct passwd *my_passwd;
struct group *my_group;
struct tm *time;
//mkdir( "test_A" , 0755); // 실행 파일이 있는 곳에 생성
//mkdir( "test_B" , 0755); // 실행 파일이 있는 곳에 생성
dir_info = opendir( "."); // 현재 디렉토리를 열기
if (dir_info != NULL)
{
while(dir_entry = readdir(dir_info))
{ // 디렉토리 안에 있는 모든 파일과 디렉토리 출력
char date[36];
if ((return_stat = stat(dir_entry->d_name, &file_info)) == -1)
{
perror("Error : ");
exit(0);
}
file_mode = file_info.st_mode;
if (S_ISREG(file_mode))
{
printf("[reg] ");
}
else if (S_ISDIR(file_mode))
{
printf("[dir] ");
}
printf( "%-10s", dir_entry->d_name);
if(strcmp(dir_entry->d_name, ".") == 0
|| strcmp(dir_entry->d_name, "..") == 0)
{
printf("\n");
continue;
}
my_passwd = getpwuid(file_info.st_uid);
my_group = getgrgid(file_info.st_gid);
//printf("uid=%s,", my_passwd->pw_name); // user id 의 이름으로 출력
//printf("gid=%s,", my_group->gr_name); // group id의 이름으로 출력
printf("uid=%d,", my_passwd->pw_uid); // user id 의 id를 숫자로 출력
printf("gid=%d,", my_group->gr_gid); // group id 의 id를 숫자로 출력
printf("%d bytes, ",file_info.st_size); // 파일 사이즈 출력하기
printf("mtime=%s\n", formatdate(date, file_info.st_mtime));
//printf("mtime=%d\n", file_info.st_mtime);
}
closedir( dir_info);
}
}
참고했던 자료
https://www.joinc.co.kr/w/man/2/stat
stas 명령 : https://ubunlog.com/ko/comando-stat-algunos-ejemplos-de-uso/
반응형