PHP 프로그래밍

본문 바로가기
사이트 내 전체검색


Web Programming >> PHP Programming
[목차]
제3장 PHP에서 꼭 알아두어야 할 함수

    4. 파일 처리 관련 함수

문자열 처리 함수와 함께 CGI 프로그램에서 가장 많이 다루게 되는 함수 중 하나는 파일 처리 함수이다.

 

fopen 함수

fopen() 함수의 정의는 다음과 같다.

 

 int fopen(string filename, string mode);

   파일을 읽거나 쓰기 등 지정한 모드로 연다.

fopen() 함수는 파일을 열고 그 파일 포인터를 반환한다. fopen() 함수에서 지정할 수 있는 모드는 다음과 같다.

fopen() 함수는 파일을 열과 그 파일 포인터를 반환한다. fopen() 함수에서 지정할 수 잇는 모드는 다음과 같다.

 

모드

기능

'r'

 파일을 일기 모드로 연다. 파일 포인터는 해당파일의 처음에 위치하게 된다.

'r+'

 파일을 읽기와 쓰기 모드로 연다. 파일 포인터는 해당 파일의 처음에 위치하게 된다.

'w'

 파일을 쓰기 모드로 연다. 해당 파일이 이미 존재하면 덮어씌우고 없으면 새로 만든다. 파일 포인터는 해당 파일의 처음에 위치하게 된다

'w+'

 파일을 읽기와 쓰기 모드로 연다. 해당 파일이 이미 존재하면 덮어씌우고 없으면 새로 만든다. 파일 포인터는 해당 파일의 처음에 위치하게 된다.l

'a'

 파일을 쓰기 모드로 연다. 해당 파일이 존재하지 않으면 새로 만들며 파일의 포인터는 해당 파일의 마지막에 위치하게 된다.

'a+'

 파일을 읽기 및 쓰기 모드로 연다. 해당 파일이 존재하지 않으면 새로 만들며 파일의 포인터는 해당 파일의 마지막에 위치하게 된다.

'r'이나 'r+' 모드는 불러들이고자 하는 파일이 이미 존재하고 있어야 하며 그렇지 않을 경우 에러를 발생시킨다. 즉, 파일이 존재하지 않으면 더 이상 코드를 진행시킬 수가 없다.

그러나 'w'나 'w+' 모드는 불러들이고자 하는 파일이 존재하지 않더라도 에러를 발생시키지 않고 대신 새로운 파일을 직접 생성한다. 이때 파일의 포인터는 해당 파일의 처음에 위치한다.

한편 'a'나 'a+' 모드는 'w'나 'w+' 모드와 마찬가지로 파일이 없을 경우 새로운 파일을 생성하나 대신 파일의 포인터는 해당 파일의 가장 마지막에 위치하게 된다. 따라서 'a'나 'a+' 모드는 기존의 파일에 새로운 내용을 추가하고자 할 때 쓴다.

 

 

 <?

 $fp = fopen("/home/younicom/public_html/php/list.dat","a");

 

 if(!$fp) {

    echo("Failed to open the file");

 } else {

    echo("Successfully opened the file!");

 }

 

 fclose($fp);

 ?>

 

[예제2.34] fopen() 함수의 사용

 

2행에서 파일 모드를 'r' 이나 'r+' 모드로 주었을 경우 /home/younicom/public_html/php 디렉토리에 list.dat 라는 파일이 존재하지 않으면 위의 스크립트는 더 이상 실행되지 않는다. 그러나 'w', 'w+' 나 'a','a+' 모드를 주었을 경우에 list.dat 파일이 존재하지 않으면 파일을 직접 생성하며 파일의 포인터는 'w', 'w+'의 경우 파일의 처음에, 'a', 'a+' 의 경우에는 파일의 마지막에 위치한다. 따라서 보통 읽기 모드로는 'r'을, 쓰기 모드로는 'w'를 추가하여 쓰기 모드로는 'a'라고 생각하면 된다.

 

fclose 함수

fclose() 함수의 정의는 다음과 같다.

 

 int fclose(int fp);

   fopen() 함수에 의해 성공적으로 열린 파일을 닫는다. 성공하면 true를, 실패하면 false를 반환한다.

[예제2.34]에서처럼 fclose()함수는 2행에서 성공적으로 열린 파일 포인터를 받아 해당 파일을 닫는다.

 

fread 함수

fread() 함수의 정의는 다음과 같다.

 

 string fread(int fp, int length);

   파일에서 length byte 만큼을 읽어들여 문자열로 반환한다.

fread() 함수는 파일 포인터가 가리키는 파일의 내용을 지정한 크기만큼만 읽어들인다.

 

 

 <?

 $fp = fopen("/home/younicom/public_html/php/list.dat","r");

 if(!$fp) {

    echo("Failed to open the file");

 }

 

 $contents = fread($fp,10);

 echo("$contents");

 

 fclose($fp);

 ?>   

 

[예제2.35] fread() 함수의 사용

 

2행에서 list.dat 파일을 읽기 모드로 열고 7행에서처럼 10byte 만큼만 읽어들여 문자열 변수 $contents에 저장한다. list.dat 파일은 다음과 같다. 앞으로도 list.dat 파일의 내용은 아래와 같다고 가정한다.

 

 He was in time for the last bus.

 He goes to his office every other day.

 It is nearly six (o'clock)

이 파일에서 10byet, 즉 영문자로는 10개의 문자이므로 7행의 실행 결과 변수 $contents에는 "He was in" 이라는 문자열이 할당된다.

 

fwrite 함수

fwrite() 함수의 정의는 다음과 같다.

 

 int fwrite(int fp, string string, int [length]);

   파일에 문자열을 (length 1) byte 만큼 쓴다. length를 지정해주지 않은 경우 지정해 준 string을 모두 파일에 쓴다.

fwrite() 함수는 파일 포인터가 가리키는 파일에 인자로 전달한 문자열을 쓴다. 마지막 세 번째 인자로 파일에 쓸 문자열의 byte수를 제한할 수 있으며 이를 생략할 경우 두 번째 인자로 지정한 모든 문자열이 파일에 쓰여진다.

 

 

 <?

 $fp = fopen("/home/younicom/public_html/php/list.dat","a");

 if(!$fp) {

    echo("Failed to open the file");

 }

 

 $str = "It is of no importance";

 fwrite($fp,$str);

 fclose($fp);

 ?>

 

[예제2.36] fwrite() 함수의 사용

 

2행에서 list.dat라는 파일을 'a' 모드 즉, 추가 쓰기 모드로 열었다. 'a'모드 이므로 이때 파일 포인터의 위치는 파일의 마지막에 있게 된다. 따라서 8행에서 문자열 $str을 파일에 쓰게 되면 길이를 지정하지 않았으므로 모든 문자열이 파일의 끝에 쓰여진다. 그 결과 list.dat 파일은 다음과 같다.

 

 He was in time for the last bus.

 He goes to his office every other day.

 It is nearly six (o'clock)

 It is of no importance

끝에 볼드(bold) 체로 표시된 것이 'a' 모드로 열었을 때 fwrite() 함수로 쓰여진 문자열이다. 만일 8행에서 fwrite($fp,$str)대신 fwrite($fp,$str,12)로 호출하였다면 12-1, 즉 "It is of no importance"의 11byte 크기인 "It is of no" 만이 파일에 쓰여진다.

 

feof 함수

feof() 함수의 정의는 다음과 같다.

 

 int feof(int fp);

   파일 포인터가 파일의 끝(EOF) 이거나 에러가 발생하였을 경우 true를, 그렇지 않을 경우에는 false를 반환한다.

feof() 함수는 보통 파일을 한 줄씩 읽어서 출력하거나 배열에 저장하고자 할 때 파일 포인터가 파일의 끝에 도달했는지를 확인하는데 쓰인다.

 

fgets 함수

fgets() 함수의 정의는 다음과 같다.

 

 string fgets(int fp, int length);

   파일 포인터가 가리키는 파일에서 length-1 byte 만큼 읽어들인다. 그러나 length-1 byte 만큼 읽어들이기 전에 개행 문자나 EOF를 만나면 실행이 중단한다.

fgets() 함수는 파일을 한줄한줄 읽어들일 때 유용한 함수이다. fgets() 함수는 파일 포인터가 가리키는 현재 위치에서 length-1 byte 만큼 읽어들이지만 중간에 개행 문자나 EOF를 만날 경우 읽기를 중단한다. 아래의 예제는 fgets() 함수를 호출하여 파일을 한 줄씩 읽어들인 후 그 내용을 그대로 출력하는 예제이다.

 

 

 <?

 $fp = fopen("/home/younicom/public_html/php/list.dat","r");

 

 if(!$fp) {

   echo("Failed to open the file");

 }

 while(!feof($fp)) {

    $line = fgets($fp,10000);

    echo("$line<br>");

 }   

 

 fclose($fp);

 ?>

 

[예제2.37] fgets() 함수의 사용

 

8행에서 fgets() 함수의 두 번째 인자로 충분히 큰 값 10,000byte를 지정하였다.

 

 He was in time for the last bus.

 He goes to his office every other day.

 It is nearly six (o'clock)

만일 2행에서 읽고자 하는 list.dat 파일의 내용이 위와 같다면 각 줄의 총 byte 수는 9,999byte를 넘지 않으므로 8행의 실행 결과 변수 $line에는 개행 문자를 만날 때까지의 문자열, 즉 list.dat 파일의 한 줄씩이 저장되고 9행에서는 저장된 값을 출력한다. 이러한 과정은 7행에서 파일 포인터가 EOF가 될 때까지 반복되므로 결과적으로 위의 list.dat 파일의 내용이 그대로 출력된다.

 

fputs 함수

fputs() 함수의 정의는 다음과 같다.

 

 int fputs(int fp, string str, int [length]);

   fputs() 함수는 fwrite() 함수와 완전히 동일한 함수이다.

 

fpassthru 함수

fpassthru() 함수의 정의는 다음과 같다.

 

 int fpassthru(int fp);

   파일 포인터가 가리키는 현재의 위치헤서 파일의 끝(EOF) 까지를 읽어들여 표준 출력 장치로 출력한다. 이 과정 중 에러가 발생하면 false를 반환한다.

fpassthru() 함수는 파일 포인터가 가리키는 파일의 현재 위치에서 파일의 끝까지를 읽어들여 표준 출력 장치에 출력한 후 해당 파일을 닫는 기능까지 스스로 한다. 즉, fpassthru() 함수를 호출한 후에 fclose($fp)와 같이 파일을 닫는 함수를 호출하면 이미 파일이 닫혀있으므로 에러가 발생한다.

 

 

 <?

 $fp = fopen("/home/younicom/public_html/php/list.dat","r");

 

 if(!$fp) {

   echo("Failed to open the file");

 }

 

 if(!feof($fp)) {

    $line = fgets($fp,10000);

    echo("$line");

 }   

 

 if(!feof($fp)) {

    fpassthru($fp);

 }   

 

 // fclose($fp);

 ?>

 

[예제2.38] fpassthru() 함수의 사용

 

fpassthru() 함수는 현재의 위치에서 파일의 끝까지를 출력하므로 현재의 위치가 EOF인지를 우선 검사한 후에 EOF가 아닐 경우 11행에서와 같이 파일의 내용을 출력한다. 14행의 fclose($fp) 함수의 호출문에 주석 처리를 한 것은 fpassthru() 함수가 호출이 되면 호출 후에 해당 파일이 닫히기 때문에 별도의 fclose() 함수 호출이 필요 없기 때문이다. 실행 결과는 다음과 같다.

 

 He goes to his office every other day. It is nearly six (o'clock)

 

readfile 함수

readfile() 함수의 정의는 다음과 같다.

 

 int readfile(string filename);

   파일을 읽어 표준 출력 장치에 출력한다.

readfile() 함수는 fpassthru() 함수처럼 파일을 읽어 표준 출력 장치로 출력하고 읽어들인 문자열의 크기를 byte수로 반환한다.

 

 

 <?

 $bytes = readfile("("/home/younicom/public_html/php/list.dat ");

 echo("<br>total size : $bytes bytes");

 ?>

 

[예제2.39] readfile() 함수의 사용

 

실행결과는 다음과 같다.

 

 He was in time for the last bus. He goes to his office every other day. It is nearly six (o'clock)

 total size : 100 bytes

readfile() 함수는 fpassthru() 함수와 달리 별도의 fopen() 함수 호출이 필요하지 않다는 장점이 있다.

 

fgetc 함수

fgetc() 함수의 정의는 다음과 같다.

 

 string fgetc(int fp);

   파일로부터 한 문자를 읽어들인다.

fgets() 함수가 지정한 크기만큼의 문자열을 읽어들이는 것에 비해 fgetc() 함수는 파일 포인터가 가리키는 파일로부터 하나의 문자를 읽어들인다.

 

 

 <?

 $fp = fopen("c:\\work\\list.dat","r");

 

 if(!$fp) {

    echo("Failed to open the file");

 }

 

 while(!feof($fp)) {

    $chr = fgetc($fp);

    if(!strcmp($chr,"\n")) {

       $chr .= "<br>";

    }

    $line .= $chr;

 }

 

 echo("$line");   

 fclose($fp);

 ?>

 

[예제2.40] fgetc() 함수의 사용

 

fgetc() 함수를 이용하여 list.dat 파일을 읽어들여 그대로 출력하는 코드로 fgets() 함수를 이용한 [예제2.37]과 동일한 결과를 얻는다.

위 코드는 list.dat 파일을 한 문자씩 읽어들이고 문자열을 연결하는 도트(.) 연산자를 이용하여 변수 $line에 전달한다. 또한 브라우저에 출력시 줄바꿈이 이루어지도록 하기 위해 10행에서와 같이 fgetc() 함수를 통해 얻은 현재의 문자가 개행 문자인지를 비교하여 같으면 그 앞에 개행 태그인 <br> 태그를 붙여 출력함으로써 [예제3.37]의 결과처럼 출력된다.

 

filesize 함수

filesize() 함수의 정의는 다음과 같다.

 

 int filesize(string filename);

   파일의 크기를 bytes수로 반환한다.

 

file_exists 함수

file_exists() 함수의 정의는 다음과 같다.

 

 int file_exists(string filename);

   filename으로 전해준 이름이 존재하는지 검사하여 존재하면 true를, 그렇지 않으면 false를 반환한다.

 

is_file 함수

is_file() 함수의 정의는 다음과 같다.

 

 bool is_file(string filename);

   filename으로 전해준 이름이 정상적인 파일일 경우 true를 반환한다.

 

is_dir 함수

is_dir() 함수의 정의는 다음과 같다.

 

 bool is_dir(string filename);

   filename으로 전해준 이름이 디렉토리일 경우 true를 반환한다.

 

is_link 함수

is_link() 함수의 정의는 다음과 같다.

 

 bool is_link(string filename);

   filename으로 전해준 이름이 symbolic link 일 경우 true를 반환한다.

 

is_executable 함수

is_executable() 함수의 정의는 다음과 같다.

 

 bool is_executable(string filename);

   filename으로 전해준 이름이 실행 가능한 파일일 경우 true를 반환한다.

 

is_readable 함수

is_readable() 함수의 정의는 다음과 같다.

 

 bool is_readable(string filename);

   filename으로 전해준 이름이 읽기 가능한 파일일 경우 true를 반환한다.

 

is_writeable 함수

is_writeable() 함수의 정의는 다음과 같다.

 

 bool is_writeable(string filename);

   filename으로 전해준 이름이 쓰기 가능한 파일일 경우 true를 반환한다.

다음의 예제를 보자

 

 

 <?

 $filename = "/home/younicom/public_html/php/list.dat";

 

 if(!file_exists($filename)) {

    echo("${filename} 파일이 존재하지 않습니다.<br>");

    exit;

 }

   

 if(!is_file($filename)) {

    echo("${filename} 은 파일이 아닙니다.<br>");

    exit;   

 }

 

 if(!is_dir($filename)) {

    echo("${filename} 은 디렉토리가 아닙니다.<br>");

    exit;   

 }

 

 if(!is_link($filename)) {

    echo("${filename} 은 심볼릭 링크가 아닙니다.<br>");

    exit;   

 }

 

 if(!is_readable($filename)) {

    echo("${filename} 은 읽을 수 없는 파일입니다.<br>");

    exit;   

 }

 

 if(!is_writeable($filename)) {

    echo("${filename} 은 쓰기불가능한 파일입니다.<br>");

    exit;   

 }

 

 if(!is_executable($filename)) {

    echo("${filename} 은 실행불가능한 파일입니다.<br>");

    exit;   

 }

 

 ?>

   

[예제2.41] 파일 체크 관련 함수의 사용

 

[예제2.41]은 파일의 존재 유무 및 파일의 형태를 체크하는 코드이다.

 

copy 함수

copy() 함수의 정의는 다음과 같다.

 

 int copy(string source, string dest);

   파일을 복사한다. 복사가 제대로 수행될 경우 true를 반환한다.

 

 

 <?

 $src = "c:\\work\list.dat";

 

 if(!copy($src,"c:\\work\\list_copy.dat")) {

    echo("Failed to copy $src file");

    exit;

 }   

 ?>

 

[예제2.42] copy() 함수의 사용

 

rename 함수

rename() 함수의 정의는 다음과 같다.

 

 int rename(string oldname, string newname);

   파일의 이름을 바꾼다. 제대로 수행될 경우에 true를 반환한다.

 

 

 <?

 $src = "/home/younicom/public_html/php/list.dat";

 

. if(!rename($src,"/home/younicom/public_html/php/rename.dat")) {

   echo("Failed to rename $src file");

   exit;

 }   

 ?>

 

[예제2.43] rename() 함수의 사용

 

unlink 함수

unlink() 함수의 정의는 다음과 같다.

 

 int unlink(string filename);

   파일을 삭제한다. 제대로 수행될 경우에 true를 반환한다.

 

 

 <?

 $src = "/home/younicom/public_html/php/list.dat";

 

 if(!file_exists($src)) {

    echo("$src file does not exist!");

    exit;

 }

 

 if(!unlink($src)) {

    echo("Failed to delete $src file");

    exit;

 }   

 ?>

 

[예제2.44] unlink() 함수의 사용

 

mkdir/rmdir 함수

mkdir() 과 rmdir() 함수의 정의는 다음과 같다.

 

 int mkdir(string pathname, int mode);

   mkdir() 함수는 지정한 디렉토리를 생성한다 이때 mode를 통해 디렉토리 생성과 함께 퍼미션을 지정할 수 있다. 제대로 수행될 경우에 true를 반환한다.

 int rmdir(sring dirname);

   rmdir()함수는 지정한 디렉토리를 삭제한다. 이때 디렉토리는 비어 있어야 한다.

 

 

 <?

 $dirname = "/home/younicom/public_html/php/temp";

 

 if(!mkdir($dirname,0755)) {

    echo("Failed to create $dirname directory");

    exit;

 }

 

 if(!rmdir($dirname)) {

    echo("Failed to remove $dirname directory");

    exit;

 }

 ?>

 

[예제2.45] mkdir() 과 rmdir() 함수의 사용

 

basename/dirname 함수

basename() 과 dirname() 함수의 정의는 다음과 같다.

 

 string basename(string path);

   basename() 함수는 패스까지 포함한 파일의 전체 경로명을 인자로 받아 파일명만을 반환한다.

 string dirname(string path);

   dirname() 함수는 패스까지 포함한 파일의 전체 경로명을 인자로 받아 디렉토리 명만을 반환한다.

 

 

 <?

 $path = "/home/ftp/readme.txt";

 $base = basename($path);

 echo("$base<br>");

 

 $dir = dirname($path);

 echo($dir);

 ?>

 

[예제2.46] basename() 과 dirname() 함수의 사용

 

file 함수

file() 함수의 정의는 다음과 같다.

 

 array file(string filename);

   file() 함수는 파일을 줄 단위로 읽어서 각 줄의 문자열을 배열 원소로 하는 배열로 반환한다. 그 외에는 readfile() 함수와 동일하다.

 

 

 <?

 $filename = "/home/youniom/public_html/php/list.dat";

 $line = file($filename);

 

 while(list($key,$val) = each($line)) {

    echo("$val<br>");

 }

 ?>   

 

[예제2.47] file() 함수의 사용

 

[목차]

개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.