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 |
๋๊ธ