리눅스의 ls 명령어 구현하기
#include<stdio.h>
#include<stdlib.h>
// 디렉터리 관련 DIR, struct dirent, opendir(), readdir(), closedir() 등이 정의된 헤더 포함
#include<dirent.h>
// Unix 에 쓰이는 표준 심볼들과 상수, 함수들이 정의된 헤더 포함
#include<unistd.h>
int main(int argc, char* argv[])
{
// cwd에 1024 byte 동적할당
char * cwd = (char *)malloc(sizeof(char) * 1024);
// DIR 과 dirent 구조체 포인터를 만들고 일단 NULL 대입
DIR * dir = NULL;
struct dirent * entry = NULL;
// 추가 인자 없이 실행된 경우
if(argc==1){
// getcwd() 함수는 현재 작업 디렉토리의 경로명을 문자열로 얻음
// 이 값을 cwd 버퍼에 저장
getcwd(cwd, 1024);
// opendir() 함수는 디렉토리 스트림을 열어서 DIR* 포인터를 반환함
// 이 값을 dir에 저장해서 사용
if((dir = opendir(cwd)) == NULL)
{
printf("current directory open error\n");
exit(1);
}
}else
{
// main 함수에 추가 인자가 전달된 경우 argv[1] 문자열로 디렉토리 스트림 열어
// 디렉토리 포인터 변수에 담기
if((dir = opendir(argv[1])) == NULL)
{
printf("directory open error\n");
exit(1);
}
}
// readdir()함수는 디렉토리 포인터를 통해서 디렉토리 정보를 하나씩 차례대로 읽음
// 디렉토리 스트림의 끝에 도달하거나 에러가 발생하면 NULL을 리턴
// 정상적으로 읽은 경우 struct dirent 구조체 포인터를 반환하는데 이 값을 entry에 저장하고
// 파일명이 저장된 구조체 멤버인 char 배열 d_name을 문자열로 출력
while((entry = readdir(dir)) != NULL)
{
printf("%s\n", entry->d_name);
}
printf("\n");
// 동적할당 해제하고 디렉터리 스트림 닫기
free(cwd);
closedir(dir);
return 0;
}
struct dirent 구조체와 DIR 구조체의 정의
getcwd 함수의 원형
#include <unistd.h>
char *getcwd(char *buf, size_t size);
실행 화면
'프로그래밍 > C' 카테고리의 다른 글
C ] 명령 프롬프트 구현 (함수포인터 사용) (0) | 2022.08.25 |
---|---|
C ] 전처리기 (Preprocessor) (0) | 2022.08.24 |
C, Linux ] main 함수의 매개변수 사용해서 파일 입출력 하기 (0) | 2022.08.17 |
C ] 가변인자 함수 만들기, 가변인자 출력함수 만들기 (0) | 2022.08.12 |
[ Visual Studio ] CRT 라이브러리로 메모리 누수 탐지하기 (0) | 2022.05.02 |