본문 바로가기

PHP/PHP Programming

[PHP] 파일 열기 함수

반응형

[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
    $fp = fopen("C:\\Developer\\Apache2.2\\htdocs\\swingdance.txt", "rb+");
?>

 출력결과

 




반응형