본문 바로가기
PHP

PHP file

by FraisGout 2020. 7. 2.

파일 처리

파일(file)이란 의미 있는 정보를 담고 있으며, 이름을 가지고 있는 저장 장치상의 논리적인 단위를 의미합니다.

 

PHP에서는 데이터를 파일에 저장할 수도 있으며, 파일로부터 데이터를 읽어 들일 수도 있습니다.

 

파일 처리 과정

PHP에서 파일을 읽고 쓰는 과정은 각각 다음과 같은 단계를 거쳐서 처리됩니다.

 

 

 

파일 읽기

 

1. 파일 열기, 열리지 않으면 종료함.

2. 파일에서 데이터 읽기

3. 파일 닫기

 

 

 

파일 쓰기

 

1. 파일 열기, 파일이 존재하지 않으면 생성함.

2. 파일에 데이터 쓰기

3. 파일 닫기

 

 

 

다음 예제는 회원 가입을 위한 간단한 form 예제입니다.

 

)

<form action="request.php" method="post">

이름 : <input type="text" name="name"><br>

성별 :

<input type="radio" name="gender" value="female">여자

<input type="radio" name="gender" value="male">남자<br>

이메일 : <input type="text" name="email"><br>

<input type="submit">

</form>

 

 

 

다음 예제는 위의 예제를 통해 사용자가 입력한 회원 가입 정보를 서버 측에서 처리하는 PHP 스크립트 예제입니다.

 

)

$name = $_POST["name"]; // 전송받은 데이터 대입

$gender = $_POST["gender"];

$email = $_POST["email"];

 

echo "이름 : ".$name."<br>"; // 데이터 출력

echo "성별 : ".$gender."<br>";

echo "이메일 : ".$email;

 

 

 

위의 예제는 단순히 입력받은 내용을 출력하는 예제입니다.

 

파일 열기

PHP에서 파일은 fopen() 함수를 이용하여 열 수 있습니다.

 

fopen() 함수에는 첫 번째 인수로 열 파일의 주소를 전달합니다.

 

두 번째 인수로는 파일에 대한 접근 권한을 명시하는 파일 모드를 전달해야 합니다.

또한, 윈도우 시스템에서는 위와 같은 파일 모드 뒤에 다음과 같은 플래그를 추가하여 해당 파일의 텍스트 모드와 바이너리 모드를 명시할 수 있습니다.

 

 

 

파일 모드에 't' 플래그를 추가하면, 해당 파일을 텍스트 모드(text mode)로 열게 됩니다.

 

텍스트 모드로 열린 파일은 파일 내부에 존재하는 줄 바꿈 문자('\n', '\r\n')를 해석하여 실제로 줄 바꿈 된 상태로 전달할 것입니다.

 

 

 

파일 모드에 'b' 플래그를 추가하면, 해당 파일을 바이너리 모드(binary mode)로 열게 됩니다.

 

바이너리 모드로 열린 파일은 파일 내부에 존재하는 줄 바꿈 문자('\n', '\r\n')를 해석하지 않고 그대로 전달할 것입니다.

이러한 플래그의 기본 설정값은 PHP 버전마다 다르게 적용될 것입니다.

따라서 fopen() 함수를 사용하여 파일을 열 때는 서로 다른 운영체제와 PHP 버전 간의 이식성을 고려하여 항상 'b' 플래그를 추가하는 것이 좋습니다.

 

다음 예제는 list.txt 파일을 쓰기 전용으로 연 후, 파일 포인터를 파일의 끝부분에 위치시키는 예제입니다.

 

)

$fp = fopen("list.txt", 'a');

 

 

 

위의 예제에서 fopen() 함수는 해당 파일을 가리키고 있는 파일 포인터를 반환하여 변수 $fp에 대입합니다.

 

이렇게 저장된 파일 포인터를 이용하여 해당 파일에 접근할 수 있습니다.

 

파일 읽기

fopen() 함수를 이용하여 파일을 연 후에는 데이터를 읽어 올 수 있습니다.

 

PHP에서는 파일의 데이터를 읽기 위한 여러 함수를 제공합니다.

 

 

 

1. fgets()

 

2. fgetc()

 

3. readfile()

 

fgets() 함수

fgets() 함수는 해당 파일에서 데이터를 한 번에 한 줄씩 읽어들입니다.

 

이 함수는 파일 포인터가 파일의 끝에 도달하거나, 줄 바꿈 문자를 만날 때까지 계속 수행됩니다.

 

)

$fp = fopen("list.txt", 'r'); // list.txt 파일을 읽기 전용으로 열고 반환된 파일 포인터를 $fp에 저장함.

 

 

while(!feof($fp)){ // 파일의 끝까지

$member = fgets($fp); // 한 줄씩 $member 변수에 저장하고

echo $member."<br>"; // 출력함.

}

 

 

 

위의 예제에서는 파일의 끝을 알아보기 위해서 feof() 함수를 사용합니다.

 

feof() 함수는 전달받은 파일 포인터가 파일의 끝에 도달하면, true를 반환합니다.

EOF는 파일의 끝이라는 'End Of File'의 의미입니다.

 

fgetc() 함수

fgetc() 함수는 해당 파일에서 데이터를 한 번에 한 글자씩 읽어 들입니다.

 

이 함수는 전달받은 파일 포인터가 가리키는 문자를 반환합니다.

 

 

 

다음 예제는 앞서 살펴본 fgets() 함수 예제를 fgetc() 함수를 이용하여 구현한 예제입니다.

 

)

$fp = fopen("list.txt", 'r'); // list.txt 파일을 읽기 전용으로 열고 반환된 파일 포인터를 $fp에 저장함.

 

 

while(!feof($fp)){ // 파일의 끝까지

$char = fgetc($fp); // 한 글자씩 $char 변수에 저장하고

 

 

 

if($char == "\n") // 출력함.

$char = "<br>";

 

 

 

if(!feof($fp))

echo $char;

}

 

 

 

위의 예제에서 첫 번째 if 문은 반환된 문자가 줄 바꿈 문자일 때, 해당 문자를 HTML <br>태그로 바꿔주는 역할을 합니다.

 

두 번째 if 문은 파일의 끝을 출력하지 않기 위해 사용됩니다.

fgetc() 함수는 바이너리 데이터를 안전하게 처리(binary-safe)할 수 있습니다.

 

readfile() 함수

readfile() 함수는 해당 파일에서 데이터를 한 번에 모두 읽어 들입니다.

 

이 함수는 전달받은 파일 포인터가 가리키는 파일의 데이터를 모두 읽은 후, 출력 버퍼(output buffer)에 저장합니다.

 

)

echo readfile("list.txt");

 

파일 닫기

PHP에서 사용이 모두 끝난 파일은 fclose() 함수를 이용하여 닫을 수 있습니다.

 

)

fclose($fp);

 

파일 쓰기 처리 과정

PHP에서 파일을 쓰는 과정은 다음과 같은 단계를 거쳐서 처리됩니다.

 

 

 

1. 파일 열기, 파일이 존재하지 않으면 생성함.

2. 파일에 데이터 쓰기

3. 파일 닫기

 

파일 열기

파일 읽기와 마찬가지로 fopen() 함수를 이용하여 파일을 열 수 있습니다.

 

파일에 데이터를 쓸 경우에는 파일 모드를 쓰기가 가능한 모드로 설정해야 합니다.

 

)

$fp = fopen("list.txt", 'w');

 

파일 쓰기

fopen() 함수를 이용하여 파일을 연 후에는 해당 파일에 데이터를 쓸 수 있습니다.

 

 

 

PHP에서는 파일에 데이터를 쓰기 위해 fwrite() 함수와 fputs() 함수를 제공합니다.

 

위의 두 함수 모두 해당 파일에 문자열을 저장하는 작업을 수행합니다.

 

)

$str = $name."\t".$gender."\t".$email."\n";

fwrite($fp, $str);

 

 

 

위의 예제처럼 fwrite() 함수에는 파일 포인터와 파일에 저장할 데이터가 저장된 문자열을 인수로 전달합니다.

fwrite() 함수는 바이너리 데이터를 안전하게 처리(binary-safe)할 수 있습니다.

 

파일 닫기

PHP에서 사용이 모두 끝난 파일은 fclose() 함수를 이용하여 닫아줘야 합니다.

 

)

fclose($fp);

 

 

 

위의 예제처럼 fclose() 함수에는 닫고자 하는 파일을 가리키는 파일 포인터를 인수로 전달합니다.

 

파일이 정상적으로 닫혔을 때는 true를 반환하며, 그렇지 않을 때는 false를 반환합니다.

 

파일 쓰기 예제

다음 예제는 PHP 스크립트에서 파일에 전송받은 데이터를 쓰는 과정을 나타내는 예제입니다.

 

)

$name = $_POST["name"]; // 전송받은 데이터 대입

$gender = $_POST["gender"];

$email = $_POST["email"];

 

 

echo "이름 : ".$name."<br/>"; // 데이터 출력

echo "성별 : ".$gender."<br/>";

echo "이메일 : ".$email;

 

$fp = fopen("list.txt", 'a'); // list.txt 파일을 쓰기 전용으로 열고 반환된 파일 포인터를 $fp에 저장.

 

$str = $name."\t".$gender."\t".$email."\n";

fwrite($fp, $str); // list.txt 파일에 $str 변수를 저장함.

 

fclose($fp); // list.txt 파일 닫음.

 

echo "회원 등록 완료";

 

 

파일 존재 여부 확인

file_exists() 함수는 전달받은 파일이나 디렉터리가 존재하는지를 검사합니다.

 

이 함수를 사용하면, 파일을 열기 전에 먼저 해당 파일이 존재하는지를 확인할 수 있습니다.

 

)

if(file_exists("list.txt"))

echo "파일이 존재합니다.";

else

echo "파일이 존재하지 않습니다.";

 

파일 크기 확인

filesize() 함수는 전달받은 파일의 크기를 바이트 값으로 반환합니다.

 

)

echo filesize("list.txt");

 

 

 

현재 대부분의 운영체제에서 PHP의 정수 타입으로 32비트 정수를 사용하고 있습니다.

 

따라서 파일의 크기가 2GB보다 크게 되면, filesize() 함수는 예상치 못한 결과를 반환할 수도 있습니다.

 

파일 내부 탐색

fopen() 함수의 결과로 반환된 파일 포인터를 이용하면, 파일 내부를 직접 탐색할 수도 있습니다.

 

PHP에서는 파일 포인터의 위치를 변경하는 다음 함수를 제공합니다.

 

 

 

1. ftell() : 전달받은 파일 포인터가 현재 가리키고 있는 위치를 반환합니다.

 

2. rewind() : 전달받은 파일 포인터를 해당 파일의 맨 처음으로 이동시킵니다.

 

3. fseek() : 전달받은 파일 포인터를 특정 위치로 이동시킵니다.

 

 

 

)

$fp = fopen("list.txt", 'r'); // list.txt 파일을 읽기 전용으로 열고 반환된 파일 포인터를 $fp에 저장함.

 

 

while(!feof($fp)){ // 파일의 끝까지

$member = fgets($fp); // 한 줄씩 $member 변수에 저장하고

echo $member."<br/>"; // 출력함.

}

 

echo ftell($fp)."<br>"; // 현재 파일 포인터는 파일의 끝부분을 가리킴.

rewind($fp); // 파일 포인터를 파일의 시작 부분으로 이동시킴.​​​

echo ftell($fp);

 

 

 

fseek() 함수는 첫 번째 인수로 파일 포인터를 전달받습니다.

 

두 번째 인수로는 세 번째 인수를 기준으로 얼마만큼 파일 포인터를 옮겨야 하는지에 대한 오프셋을 전달받습니다.

 

세 번째 인수는 오프셋 기준을 나타내며, 생략하면 SEEK_SET(파일의 처음)을 기본값으로 설정합니다.

 

 

 

오프셋 기준으로 전달할 수 있는 값은 다음과 같습니다.

 

 

 

1. SEEK_SET : 파일의 처음을 기준으로 함. (기본 설정)

 

2. SEEK_CUR : 파일 포인터의 현재 위치를 기준으로 함.

 

3. SEEK_END : 파일의 끝을 기준으로 함.

 

 

 

)

$fp = fopen("list.txt", 'r');

 

 

fseek($fp, 0, SEEK_END); // 파일 포인터를 파일의 끝으로 이동시킴.

echo ftell($fp)."<br>";

 

fseek($fp, 0); // 파일 포인터를 파일의 맨 처음으로 이동시킴.

echo ftell($fp);

 

파일 삭제

unlink() 함수는 전달받은 주소에 위치한 파일을 삭제합니다.

 

이 함수는 파일이 정상적으로 삭제됐을 때 true를 반환합니다.

 

만약 파일을 지울 수 있는 권한이 없거나 파일이 존재하지 않은 경우, 또는 파일이 정상적으로 삭제되지 못 했을 때는 false를 반환합니다.

 

)

if(unlink("list.txt"))

echo "파일 삭제 성공";

else

echo "파일 삭제 실패";

'PHP' 카테고리의 다른 글

PHP exception  (0) 2020.07.02
PHP cookie & session  (0) 2020.07.02
PHP Form  (0) 2020.07.02
PHP inheritance  (0) 2020.07.02
PHP class  (0) 2020.07.02

댓글