본문 바로가기
Study/php

PHP 기초 ] 파일제어 2

by Answer Choi 2015. 9. 30.
반응형

좀 더 세세한 파일제어를 위해 fopen, fclose, fwtite, fread 등을 사용 합니다.


resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )


fopen은 file open이라고 생각하면 됩니다.


fopen(파일경로및 파일명, 옵션)로 많이 사용합니다.


옵션은 


A list of possible modes for fopen() using mode

mode

Description

'r'

Open for reading only; place the file pointer at the beginning of the file.

'r+'

Open for reading and writing; place the file pointer at the beginning of the file.

'w'

Open for writing only; place the file pointer at the beginning of the file and truncate the file to zero length. If the file does not exist, attempt to create it.

'w+'

Open for reading and writing; place the file pointer at the beginning of the file and truncate the file to zero length. If the file does not exist, attempt to create it.

'a'

Open for writing only; place the file pointer at the end of the file. If the file does not exist, attempt to create it. In this mode,fseek() only affects the reading position, writes are always appended.

'a+'

Open for reading and writing; place the file pointer at the end of the file. If the file does not exist, attempt to create it. In this mode, fseek() only affects the reading position, writes are always appended.

'x'

Create and open for writing only; place the file pointer at the beginning of the file. If the file already exists, the fopen() call will fail by returning FALSE and generating an error of level E_WARNING. If the file does not exist, attempt to create it. This is equivalent to specifying O_EXCL|O_CREAT flags for the underlying open(2) system call.

'x+'

Create and open for reading and writing; otherwise it has the same behavior as 'x'.

'c'

Open the file for writing only. If the file does not exist, it is created. If it exists, it is neither truncated (as opposed to 'w'), nor the call to this function fails (as is the case with 'x'). The file pointer is positioned on the beginning of the file. This may be useful if it's desired to get an advisory lock (see flock()) before attempting to modify the file, as using 'w' could truncate the file before the lock was obtained (if truncation is desired, ftruncate() can be used after the lock is requested).

'c+'

Open the file for reading and writing; otherwise it has the same behavior as 'c'.


r은 readonly, w, a, c는 writing only인데 w는 파일의 첫부분에 쓰기, a는 마지막 부분에 쓰기, 


c도 첫부분 부터 쓰기인데 w처럼 기존 내용을 지우진 않습니다.


덮어쓰기를 합니다.


그리고 x는 파일을 생성하고 writing할때 사용합니다.


뒤에 '+'가 붙으면 reading, writing 모두 가능합니다.


그리고 r을 제외하곤 파일이 없는 경우 새로 생성하게 됩니다.


일단 r옵션으로 파일을 열어보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<link rel="stylesheet" href="/css/master.css" media="screen" title="no title" charset="utf-8">
<body>
  <?php
  $file = "./file11.txt";
  fopen($file'r');
  if(file_exists($file)){
    echo 'file exists';
  }else{
    echo 'file not exist';
  }
?>
</body>
</html>
cs


파일이 없는 경우 요렇게 하게되면 else로 빠지게 됩니다. 


왜냐하면 'r'은 파일을 생성하지 않습니다.


따라서 다른 옵션을 줘야합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<link rel="stylesheet" href="/css/master.css" media="screen" title="no title" charset="utf-8">
<body>
  <?php
  $file = "./file11.txt";
  fopen($file'w');
  if(file_exists($file)){
    echo 'file exists';
  }else{
    echo 'file not exist';
  }
?>
</body>
</html>
cs


w옵션을 줘서 파일을 만듭니다.



파일이 생성 되었습니다.


int fwrite ( resource $handle , string $string [, int $length ] )


이제 이 파일에 글을 적어보겠습니다.


fwrite(open한 resource, text)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<link rel="stylesheet" href="/css/master.css" media="screen" title="no title" charset="utf-8">
<body>
  <?php
  $file = "./file11.txt";
  $firstfile=fopen($file'w');
  if(file_exists($file)){
    echo 'file exists';
    fwrite($firstfile"First String\n");
    fwrite($firstfile"Second String\n");
  }else{
    echo 'file not exist';
  }
  fclose($firstfile);
?>
</body>
</html>
cs


Line 6에 보시면 fopen에 대한 resource를 $firstfile로 선언했습니다.


Line 9~10에서 두가지 String을 적어줬습니다.


Line 14 에서 fclose를 사용해서 파일을 닫았습니다.


파일을 열어보면



적은 내용이 그대로 적혀있습니다.


몇번을 시도해도 같은내용입니다.


그런데 fopen에서 옵션을 'a'로 바꿔보면



실행할때마다 그대로 복사가 됩니다.


'c'옵션은 'w'옵션때와 같습니다.


이제 fread로 읽어와 보겠습니다.


string fread ( resource $handle , int $length )


fread(리소스, 길이)


fread를 사용해서 읽을때에는 fopen의 옵션중에 'r'을 쓰는게 가장 깔끔합니다.


위 예제에서 적었던걸 읽어오려면


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<link rel="stylesheet" href="/css/master.css" media="screen" title="no title" charset="utf-8">
<body>
  <?php
  $file = "./file11.txt";
  $firstfile=fopen($file'r');
  if(file_exists($file)){
    echo 'file exists'.'<br>';
    $filereading=fread($firstfile,8192);
  }else{
    echo 'file not exist';
  }
  fclose($firstfile);
  echo 'file read => '.$filereading;
?>
</body>
</html>
cs


를 실행하게 되면


이렇게 읽어오게 됩니다.


하지만 fwrite와 같이 쓰려면 조금 더 생각을 해야 합니다.


int fseek ( resource $handle , int $offset [, int $whence = SEEK_SET ] )


fseek(리소스, 포인터 위치) 를 사용해야 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<html>
<link rel="stylesheet" href="/css/master.css" media="screen" title="no title" charset="utf-8">
<body>
  <?php
  $file = "./file11.txt";
  $firstfile=fopen($file'w+');
  if(file_exists($file)){
    echo 'file exists'.'<br>';
    fwrite($firstfile"first String\n");
    fwrite($firstfile"Second String\n");
    fseek($firstfile0);
    $filereading=fread($firstfile,8192);
  }else{
    echo 'file not exist';
  }
  fclose($firstfile);
  echo 'file read => '.$filereading;
?>
</body>
</html>
cs


실행하면 아래와 같이 나옵니다.


만약 Line 11의 fseek을 쓰지 않게 되면 , 포인터의 위치가 젤 뒤로와서 아무것도 읽을 것이 없게 됩니다.


그 이유는  fwrite로 String을 적게되면 포인터가 그만큼 뒤로 오게 됩니다.


위 그림과 같아져서 read할게 없습니다.


따라서 fseek을 사용해서 맨 앞으로 포인터를 보내야 모두 읽을 수 있습니다.


만약 중간부터 읽고 싶으면  포인터 위치를 원하는 위치로 이동하면 됩니다.


아무것도 쓰지 않은채 바로 읽을경우


'r' 옵션의 경우


첫부분부터 읽게 되어 모두 출력됩니다.


'w+'옵션의 경우 

포인터가 처음이지만 기존 내용이 모두 삭제되어 출력될게 없습니다.


'a+'옵션의 경우


내용은 있지만 포인터가 뒤로오게 됩니다.

'c+'옵션의 경우


내용도 그대로 있고, 포인터도 젤 앞에 위치하게 됩니다.

다만 이 경우 내용을 적게되면 맨 앞부터 덮어쓰게 됩니다.


마지막으로 'x'옵션은 파일을 생성할때 쓰는데 기존에 파일이 있을 경우 오류를 발생시킵니다.

반응형

'Study > php' 카테고리의 다른 글

PHP 파일 업로드및 파일 정보보기  (0) 2015.10.01
PHP 기초 ] 폴더제어  (0) 2015.09.30
PHP 기초] 간단한 파일제어  (0) 2015.09.25
PHP 기초 ] include, namespace  (0) 2015.09.24
PHP 기초] 함수  (0) 2015.09.24

인기글