제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() 함수의
사용
|