php 입문 | 텍스트 파일 이용 | fopen 통한 파일 액세스

file()를 이용한 파일의 읽기보다도 더 유연한 대응이 필요한 경우에는, PHP에서 제공되는 가장 기본적인 파일 액세스 함수를 조합하여 사용할 수 있다. 이는 3단계의 절차로 파일에 액세스할 수 있다.

1. 파일 열기

$변수 = fopen(파일 지정, 모드 지정);

먼저 ‘fopen’라는 함수를 호출한다. 이는 인수에 지정된 파일을 열고 그 파일에 액세스할 수 있는 “파일 포인터"라는 것을 돌려준다. 파일에 액세스하는 경우는 반드시 이 fopen으로 파일을 연다.

두번째 인수에 있는 “모드 지정"이라는 것이 fopen의 포인트이다. 이는 해당 파일의 액세스 형태라는 것을 지정한다. 액세스 모드는 그 파일을 “어떤 종류의 파일를 처리할지”, “어떤 접근을 허용할지"에 대한 설정을 할 것이다. 이 모드는 다음과 같은 기호를 사용하여 지정한다.

fopen 모드를 지정하는 기호

인자 모드 포인터 위치 파일이 존재 유무
r  읽기 전용  파일의 시작   파일 내용 보존
r+  읽고 쓰기 파일의 시작  파일 내용 보존
w  쓰기 전용 파일의 시작  파일 내용 삭제, 없으면 새로 생성
w+  읽고 쓰기  파일의 시작  파일 내용 삭제, 없으면 새로 생성
a  쓰기 전용 파일의 끝  파일 내용 보존, 없으면 새로 생성
a+  읽고 쓰기 파일의 끝  파일 내용 보존, 없으면 새로 생성
x  쓰기 전용 새로운 파일 생성 파일이 존재하면 false 리턴 그리고 에러 남
x+  읽고 쓰기 새로운 파일 생성 파일이 존재하면 false 리턴 그리고 에러 남 
  • 위의 모드 인자뒤에 마지막에 b나 t를 붙일 수 있다.
    • b : 바이너리 모드로 열기
    • t : 텍스트 파일의 라인 변경 태그를 Unix에서는 \n를 사용하고, 맥에서는 \r만 사용하는데 윈도우에서는 \r\n를 사용하는데, 이러한 \n\r\n으로 변환해준다. 따라서 다른 시스템의 텍스트 파일을 윈도우 플랫폼에서 열 때 사용하면 좋다.

2. 데이터에 액세스하기

파일을 열리면, 그 다음에 하는 작업은 그 파일에서 필요한 데이터를 읽거나 데이터를 쓰거나 하는 작업을 실행한다. 여기에는 “fgets”, “fputs"라는 함수가 준비되어 있다. (각각에 대해서는 나중에 설명하겠다)

3. 파일 닫기

fclose(파일 포인터);

데이터 액세스가 완료되면 마지막으로 파일을 닫는다. 이는 fclose 라는 함수로 실행한다. 인수는 fopen으로 얻어진 파일 포인터를 지정한다.

fopen에서 파일을 열고 fclose으로 닫는 작업을 하지 않으면 안 되는가? 그것은 이것에 의해 파일 액세스 권한이 설정되기 때문이다. 일반적으로 컴퓨터의 응용 프로그램 등으로 파일을 사용하는 경우, 어느 응용 프로그램이 사용 중이라고 다른 파일로 열 수 없거나, 파일 삭제 등을 할 수 없게 된다. 그것은 “이 응용 프로그램을 사용 중이다"라는 것을 표시해주고 다른 프로그램에서 액세스할 수 없도록 하고 있기 때문이다.

만약 여러 프로그램에서 동시에 파일 액세스할 수 된다며, 그 내용이 생각하지 못한 형태로 재작성되어 버릴 가능성이 있다. 그래서 파일에 쓰여진 데이터가 손상되지 않도록 “파일을 사용할 수 있는 것은 한번에 하나의 애플리케이션만 가능"하도록 되어 있다.

fopenfclose도 이와 같은 일을 하고 있는 것이다. fopen으로 파일을 열면 다른 프로그램이 마음대로이 파일을 열어서 내용을 다시 작성할 수 없게 된다. 그리고 모든 작업 후에 fclose을 실행하여 파일을 닫아 개방하여 다른 프로그램이 파일을 사용할 수 있게 한다.