[PHP] 파일 열기 함수
■ fopen( ) : 파일을 엽니다. ■ b : 플래그 문제 ■ ## : // 프로토콜 |
■ fopen( ) 함수
resource fopen(String $filename, string @mode [, bool $use_include_path=false [, resource $context ]](PHP 4, PHP 5) |
이 함수는 호스트의 파일을 열거나 새로 만든다.
모드 |
의미 |
r | · 읽기 전용으로 연다. |
r+ |
· 읽기와 쓰기 모드로 연다 |
w |
· 쓰기 전용으로 연다 |
w+ |
· 읽기와 쓰기 모드로 연다 |
a |
· 내용 추가, 파일의 끝에 내용을 추가하고, 파일이 존재하지 않는다면 새로 만든다. |
a+ |
· 내용 추가와 읽기모드로 열기하여 파일의 끝에 내용을 추가한다. ·파일이 존재하지 않는다면 새로 만든다. |
b |
· 바이너리모드로 열기 한다. · 윈도우 환경에서는 필수 모드 |
x |
· 쓰기 전용으로 열기합니다. 파일 포인터를 파일의 맨 앞에 놓고, 파일이 이미 존재하면 E_WARNING 등급 오류가 발생한다. |
x+ |
· 읽기와 쓰기모드로 열기한다. · 나머지 x 옵션과 동일한다. |
c | · 쓰기 전용으로 연다. · 파일이 없으면 새로 ㅁ나들고, 파일이 이미 존재하면 파일의 맨 앞에 놓고 내용을 쓰지만 a와 다르다.(php5.2.6 부터) |
c+ | · 읽기와 쓰기 모드로 열기합니다. 나머지는 c옵션과 동일하다.(php5.2.6 부터) |
다음은 바이너리 출력 예제이다.
fopen_01.php |
<?php // rb → 읽기전용, 바이너리로 열기합니다. if($fp = fopen("logo.gif", "rb")) { // 바이너리로 읽기 // 파일 포인터로 지정된 파일에서 최대 길이 1024 * 100 만큼 브라우저로 출력합니다. print(fread($fp, 1024 * 100)); flush(); // 파일을 열면, 다른 스크립트에서 이용할 수 있도록 반드시 파일 포인터를 닫아야 합니다. fclose($fp); } else { print("파일을 찾을 수 없습니다."); } ?> |
출력결과 |
실패 안되었다. |
fopen_02.php |
<?php $filename = "images.bmp"; header("content-type: file/unknown"); header("content-length: ".filesize($filename)); header("content-disposition: attachment; filename=\"${filename}\""); header("content-description: php generated data"); header("pragma: no-cache"); header("expires: 0"); if($fp = fopen($filename, 'rb')) { while(!feof($fp)) { print(fread($fp,1024)); flush(); } fclose($fp); } else { print('파일을 찾을 수 없습니다.'); } ?> |
출력결과 |
fpassthru( ) 함수는 처음 파일 포인터에서 끝까지의 파일 내용을 읽어 표준 출력으로 보낸다.
fopen_03.php |
<?php // 바이너리 읽기전용으로 열기합니다. if($fp = fopen("swingdance.txt", "rb")) { fpassthru($fp); flush(); fclose($fp); } else { print("파일을 찾을 수 없습니다."); } ?> |
출력결과 |
■ b : 플래그 문제
fopen( ) 함수가 바이너리에 안전하지만 바이너리와 텍스트 파일을 구별할 수 있는 윈도우 시스템에서는 b 플래그 사용은 매우 중요하다.
그리고 fopen( ) 함수를 사용할 때 fputs( ) 함수나 fgets( ) 함수 보다는 fread( ) 함수나 fwrite( ) 함수를 사용하는 것이 권장되며, 바이너리와 텍스트 파일을 구분하지 못하는 유닉스에서는 b 플래그가 필요치 않으나 윈도우 환경에서는 중요한 부분입니다. 시스템 환경이 바뀔 수 있는 부분이 있다면 b 플래그를 사용하는 것이 좋다.
fputs( ) 함수나 fgets( )함수로 바이너리로 열거나 작성하더라도 바이너리 자룔르 유지하지 못하는 경우가 있으므로 바이너리 자료 그대로 유지되는 fread( ) 함수나 fwrite( ) 함수를 이용하는 것을 권고하고 있다.
b_flage.php |
<?php if($fp = @fopen("swingdance.txt", "ab+")) { fwrite($fp, "바이너리로 작성합니다."); fclose($fp); } if($fp = @fopen("swingdance.txt", "rb")) { fread($fp); ob_flush(); flush(); fclose($fp); } else { print("파일을 찾을 수 없습니다."); } ?> |
출력결과 |
fread는 동작하지 않았다 이유 확인 |
■ ## : // 프로토콜
filename 인수에 프로토콜 래퍼를 지정하는 경우 URL로 판별, 해당 래퍼의 프로토콜을 찾아서 파일에 접근하게 되고, 프로토콜이 명시되지 않았다면 일반적인 파일로 인식하여 파일 내용을 스트림으로 열게 된다.
protocol_01.php |
<?php @handle = fopen("http://www.example.com/", "r"); @handle = fopen("http://user:password@example.com/some.txt", "r"); @handle = fopen("php:memory", "r"); ?> |
출력결과 |
|
protocol_02.php |
<?php |
출력결과 |
|
'PHP > PHP Programming' 카테고리의 다른 글
[PHP] Division By Zero 에러 (0) | 2016.01.26 |
---|---|
[PHP] strip_tags()를 사용하여 HTML 태그 제거 하여 데이터 불러오기 (0) | 2015.11.18 |
[PHP] 파일 읽기 클래스 (0) | 2015.06.30 |
[PHP] 파일 처리 클래스 (0) | 2015.06.30 |
[PHP] 숫자 → 문자로 변경 (0) | 2015.05.07 |