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
으로 닫는 작업을 하지 않으면 안 되는가? 그것은 이것에 의해 파일 액세스 권한이 설정되기 때문이다. 일반적으로 컴퓨터의 응용 프로그램 등으로 파일을 사용하는 경우, 어느 응용 프로그램이 사용 중이라고 다른 파일로 열 수 없거나, 파일 삭제 등을 할 수 없게 된다. 그것은 “이 응용 프로그램을 사용 중이다"라는 것을 표시해주고 다른 프로그램에서 액세스할 수 없도록 하고 있기 때문이다.
만약 여러 프로그램에서 동시에 파일 액세스할 수 된다며, 그 내용이 생각하지 못한 형태로 재작성되어 버릴 가능성이 있다. 그래서 파일에 쓰여진 데이터가 손상되지 않도록 “파일을 사용할 수 있는 것은 한번에 하나의 애플리케이션만 가능"하도록 되어 있다.
fopen
및 fclose
도 이와 같은 일을 하고 있는 것이다. fopen
으로 파일을 열면 다른 프로그램이 마음대로이 파일을 열어서 내용을 다시 작성할 수 없게 된다. 그리고 모든 작업 후에 fclose
을 실행하여 파일을 닫아 개방하여 다른 프로그램이 파일을 사용할 수 있게 한다.