ls๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉ ํ dirent์ ๋ํด ์์๋ด
directory ๋ฅผ ์ด๊ธฐ ์ํด opendir() ํจ์๋ฅผ ์ฌ์ฉํ๋๋ฐ,
์๋ ๋๋ ํฐ๋ฆฌ๊ฒฝ๋ก๋ฅผ ๋ฐ๊ณ ,
๋๋ ํฐ๋ฆฌ๋ฅผ ์ด ์ ์์ผ๋ฉด DIR *, ์ด ์ ์์ผ๋ฉด NULL ๋ฐํ
DIR์ ๋ญ์ง ?
๋ค๋ฅธ ๋ธ๋ก๊ทธ ๊ธ ๊ฒ์ ์, ํ์ผ ํฌ์ธํฐ (FILE *) ์ฒ๋ผ DIR *์ ๋๋ ํฐ๋ฆฌ ํฌ์ธํฐ๋ก ์ดํดํ๋ฉด ์ข์๊ฒ ๊ฐ๋ค๊ณ ๋์ด ์์
(์ฐธ๊ณ : https://eteo.tistory.com/180 )
๋๋ ํฐ๋ฆฌ์ ์ ๋ณด๋ค์ ๋ฐํํด์ฃผ๋ ๊ฑธ๋ก ์ดํด์ค !
๊ทธ๋ผ ์ด๋ ๊ฒ ๋ฐ์ DIR *๋ฅผ ์ด๋์ ์ฐ๋์ง ?
dirent.h ํ์ผ์์ ์ฐพ์๋ณด๋.. ์ด๋ฐ๋ฐ์ ์ฐ์ธ๋ค...
mimi@mimi:/usr/include$ grep -n "(DIR \*" dirent.h 
149:extern int closedir (DIR *__dirp) __nonnull ((1));
162:extern struct dirent *readdir (DIR *__dirp) __nonnull ((1));
165:extern struct dirent *__REDIRECT (readdir, (DIR *__dirp), readdir64)
173:extern struct dirent64 *readdir64 (DIR *__dirp) __nonnull ((1));
183:extern int readdir_r (DIR *__restrict __dirp,
190:                   (DIR *__restrict __dirp,
201:extern int readdir64_r (DIR *__restrict __dirp,
209:extern void rewinddir (DIR *__dirp) __THROW __nonnull ((1));
215:extern void seekdir (DIR *__dirp, long int __pos) __THROW __nonnull ((1));
218:extern long int telldir (DIR *__dirp) __THROW __nonnull ((1));
224:extern int dirfd (DIR *__dirp) __THROW __nonnull ((1));
๊ทธ๋์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฝ์ผ๋ ค๋ฉด ? readdir() ์ฌ์ฉํ๊ธฐ !
readdir()์ ์ธ์๋ก ์์์ opendir()์์ ๋ฐํํด์ค DIR * ๊ฐ์ ๋ฃ์ผ๋ฉด dirent ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐํํด์ค !
๊ทธ๋ผ dirent๊ตฌ์กฐ์ฒด๋ ์ด๋ป๊ฒ ์๊ฒผ๋๊ฐ..
struct dirent
  {
#ifndef __USE_FILE_OFFSET64
    __ino_t d_ino;
    __off_t d_off;
#else
    __ino64_t d_ino;
    __off64_t d_off;
#endif
    unsigned short int d_reclen;
    unsigned char d_type;
    char d_name[256];		/* We must not include limits.h! */
  };
์ด๊ฑธ๋ณด๋.. d_type์ ํ์ผ์ ํ์ ์ธ ๊ฒ ๊ฐ๊ณ ,
d_name์ ํ์ผ๋ช ์ธ ๊ฒ ๊ฐ์
while()์ NULL์ด ๋์ค๊ธฐ ์ ๊น์ง๋ง ๋ฐ๋ณตํ๋ค๊ณ ํจ
readdir()์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ค ์ฝ์ผ๋ฉด NULL์ ๋ฐํํ๋ค๊ณ ํจ
๊ทธ๋์ while()์ ๋ฃ์ด๋๋ฉด ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ค ์ฝ์๋๊น์ง ๋ฐ๋ณตํ๊ณ ,
๋ฐ๋ณตํ๋ฉด์ d_name์ ์ถ๋ ฅํ๋๋ก ์๋์ ๊ฐ์ด ๊ตฌํํด๋ดค์
#include <stdio.h>
#include <dirent.h>
int main() {
    
    struct dirent *dir;
    DIR *dp = opendir(".");
    if (dp == NULL) {
        return -1;
    }
    
    while (dir = readdir(dp)) {
        printf("%s  ", dir->d_name);
    }
    printf("\n");
    closedir(dp);
    
    return 0;
}
์ด๋ ๊ฒ ๊ตฌํํ๋ฉด ์จ๊นํ์ผ๋ ๊ฐ์ด ์ถ๋ ฅ๋จ
mimi@mimi:~/Mimi/lang/c$ ./ls
.vscode  ls.c  ..  .  .ls.c.swp  echo.c  clean  clean.c  TDL.c  ls
๊ทธ๋์ argv[1]์ a ์ ๋ ฅ๋๋ฉด ์จ๊นํ์ผ๋ ์ถ๋ ฅ๋๋๋ก ์์ ํ์ !
#include <stdio.h>
#include <string.h>
#include <dirent.h>
int main(int argc, char* argv[]) {
    
    struct dirent *dir;
    DIR *dp = opendir(".");
    if (dp == NULL) {
        return -1;
    }
    
    while (dir = readdir(dp)) {
        if (argc == 1) {
            if (dir->d_name[0] == '.')
                continue;
            else
                printf("%s  ", dir->d_name);
        }
        else if (strchr(argv[1], 'a')) {
            printf("%s  ", dir->d_name);
        }
    }
    printf("\n");
    closedir(dp);
    
    return 0;
}
์คํ !
mimi@mimi:~/Mimi/lang/c$ ./ls
ls.c  echo.c  clean  clean.c  TDL.c  ls  
mimi@mimi:~/Mimi/lang/c$ ./ls -a
.vscode  ls.c  ..  .  .ls.c.swp  echo.c  clean  clean.c  TDL.c  ls'์ฒ์ฒํ, ๊พธ์คํ.. > C' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [C : touch] C์ธ์ด๋ก touch ๊ตฌํ (0) | 2023.12.18 | 
|---|---|
| [C : ls] C๋ก ls ๊ตฌํ ์, -a ์ต์  ์ฒ๋ฆฌ #getopt (0) | 2023.12.18 | 
| [C : ls] ls ์ต์  ์ธ์์ฒ๋ฆฌ #getopts (0) | 2023.12.17 | 
| [C : ctags] ctags ์ค์น #universal-ctags (0) | 2023.12.16 | 
| [C : echo] ํฐ๋ฏธ๋๋ก ์ ๋ ฅ๋ฐ์ ๊ฐ ์ถ๋ ฅํ๊ธฐ #argc #argv (0) | 2023.12.16 | 
๋๊ธ