회원가입

로그인

아이디
비밀번호
ID/PW 찾기
아직 회원이 아니신가요? 회원가입 하기

[!] 웹 프로그래밍 - 파일 목록 가져오기

Profile
:맥노턴

프로그래머는 게으르다.

그럴 수 밖에 없다. 아니, 그래야만 한다. 부지런한 프로그래머는 늘 분주하며 소스코드가 길어지는 것을 좋아한다.

반복작업도 순차적으로 처리되어야 직성이 풀린다. 커서키를 아래로 내리기만하면 코드들을 알아보기 쉽기 때문이다.

그들의 노가다(?)는 나같은 게으른 사람으로서는 불행해 보이기까지 한다.

반면에 게으른 프로그래머는 역시 꼼짝않고 앉아서 이런저런 궁리를 한다. 손발을 덜 움직이고, 나중에 또 써먹을 수 있고, 요구에 따라 손쉽게 바꿀 수 있는 코드를 궁리한다.

이런 저런 변화에 능숙히 변화하려면,

문제의 공통점과 차이점,
예외를 가능한한 상세히 찾아내야 한다.

공통점은 반복시키고, 차이점은 배제시키며, 예외상황은 예외상황 처리기에게 맡겨버린다. 이로서 코드는 단순화되고, 더욱 신속하게 실행된다.

요즘은 자신의 웹사이트에 배경음악을 넣는 것이 유행이다. 난 게으른 프로그래머로서 에디터를 이용해 HTML 소스고치기를 매우(!) 싫어한다.

코드 스스로가 알아서 바꿔주길 바란다. 난 그냥 변환된 음악 파일을 FTP로 전송해주고 접속을 끊기만 하면 된다.

그러기에 필요한 것이 디렉토리 내에 있는 파일들의 목록을 가져오는 소스일 것이다.

서론이 길었다.

하지만, 쓸모없는 말은 아니었다 생각한다. 단계를 알아본다.

1. opendir() 을 이용해 핸들러를 가져온다.

2. readdir() 에 핸들러를 제공해 파일 목록을 가져와 변수에 대입한다.

3. 2의 과정을 반복하면서 모든 목록을 다~ 싸그리 가져온다. 핸들러가 생소하게 들릴지 모르겠지만 용도로 표현하자면 지난 시간에 이야기한 파일 포인터와 비슷하다.

### 1 단계 ###

$dir_hdl = open("songs"); //하위 디렉토리 songs의 핸들을 가져온다.

hdl 이라는 것은 handler를 줄여서 표현한 것이다. 포인터는 pnt 라고 표현할 수 있을 것이다.

이건 절대로 프로그래머 개인이 정한 것이므로, 왜 그렇게 했느냐는 둥, 다른 사람은 이렇게 한다는 둥... 하면 매우 곤란하다.

자칫 신경쇠약이 걸릴 수 있으며 이로인해 명이 줄어들어 일찍 사망한다면, 그런 의견을 제시한 사람은 "간접살인"을 하게 되는 것이다.

### 2 단계 ###

$read_list = read($dir_hdl); //이렇게해서 하나의 파일을 가져온다.

디렉토리내의 파일 이름을 가져올때는 "." 과 ".." 도 포함된다. 즉, 파일명과 디렉토리를 구분하지 않아서 생기는 것인데, 파일과 디렉토리를 구분하는 내용은 오사마 빈 라덴의 문제가 해결되면 그때가서 생각해보기로 하자.

### 3 단계 ###

하나만 가져오면 컴퓨터도 섭섭해한다. 몽땅 가져올 생각이므로... while{} 루프를 이용해 뺑이돌린다.

while($read_list = read($dir_hdl)) { $file_list[] = $read_list; }

하면 모든 목록이 $file_list 라는 배열(array)로 저장된다.

불필요한 . 과 .. 을 없애기 위해서는...

if ($read_list == "." || $read_list == "..") { continue; }

를 넣어주면 된다. 어디에?? 알아서 넣어보기 바란다.

여기서 while{}의 뺑뺑이를 건너뛰게 하는 명령은 continue; 이다.

{}의 뺑뺑이를 그만 돌리게 하고 빠져나오는 명령은 break; 이다.

while{}이나 for{} 등의 루프를 잘 사용하면 코드를 간략히 줄일 수 있고, 건강해질 수 있다. 배열에 저장된 목록을 이용해서 주크박스도 만들 수 있고, 맥노턴의 포토앨범 같은 사진 목록도 쉽게 만들 수 있다.

### IMPORTANT ###

추석을 맞이하여 이쯤에서 매우 중요한 노하우를 하나 선물할까 한다. 저대로 그냥 돌리면 이론상으로는 완벽하다. 하지만 문제가 발생한다.

FTP를 이용해 전송한 파일의 목록이 제대로 출력되지 않을 때가 있다. FTP로 전송한 파일은 목록에 체크되지 않아 파일이 없다고 나올 수도 있다.

시만텍 에러다. 이건 PHP의 띨띨함을 탓해야 하겠지만 어쩔 수 없는 노릇이니니 방도를 마련할 수 밖에...

코드의 앞쪽에 chdir() 를 이용해 목록이 출력될 디렉토리로 작업 디렉토리를 변경해야 한다.

즉, 내가 목록을 갖고 싶은 디렉토리가 현재 디렉토리 아래의 songs라면

chdir("songs");

라고 하여 작업 디렉토리를 이동한 후,

$dir_hdl = open("songs");

 가 아니라 현재 작업 디렉토리가 songs 이므로,

$dir_hdl = open(".");

 하시면 100% 파일 목록이 출력되게 됩니다.

 목록 출력 기능으로 수많은 유틸리티나 주크박스 등을 만드실 수 있을 겁니다. 바이~~

 * :맥노턴님에 의해서 게시물 이동되었습니다 (2002-07-29 12:22)

 * :맥노턴님에 의해서 게시물 이동되었습니다 (2005-07-27 17:46)

Profile
:맥노턴
레벨 30
563764/686490
80%
McNorton & Education Lab.
Director
댓글
1
  • 김병희
    2004.12.13
    맥노턴님 오랫만에 찾아 뵙습니다.
    위 내용은 백과넷에 미러해 두었는데, 그래도 원본 파일을 보고 싶어서 들어 왔다가 오자를 발견했네요.
    1. opendir() 을 이용해 핸들러를 가져온다.
    에서는 맞는데
    $dir_hdl = open("songs"); //하위 디렉토리 songs의 핸들을 가져온다.
    에 가서 'dir' 꼬리가 잘려 버렸네요.
    readdir() 함수도 마찬가지이고요.
    참고하는 사람들을 위해 고쳐 두시죠?
    백과넷/글방넷은 자동화를 위한 리뉴얼 대장정에 들어 갔습니다. 상당한 시간이 걸리겠지요.
    건강하세요.
댓글 쓰기
권한이 없습니다.

로그인

아이디
비밀번호
ID/PW 찾기
아직 회원이 아니신가요? 회원가입 하기