'phP 함수 레퍼런스/파일 시스템 함수'에 해당되는 글 29건

flock 함수는 파일을 쓰거나 읽을 때, 또는 파일 잠금 해제 등 유닉스나 윈도우에서 작동합니다. 파일 작성중 다른 사용자의 사용의 접근을 차단하여 파일의 깨지는 문제를 예방할 수 있습니다.


bool flock ( resource $handle , int $operation [, int &$wouldblock ] )


flock 함수는 다음의 상수를 사용할 수 있습니다.


 LOCK_SH

 LOCK_EX

 LOCK_UN

 파일 읽기일 때 잠금

 파일 쓰기일 때 잠금

 파일 잠금 해제


사용방법은 다음과 같습니다.


 <?php
 
// 파일 새로 작성시
 
if($fp = @fopen('readme.txt''wb'))
 {
       
// 파일을 먼저 잠금합니다.
       
@flock($fpLOCK_EX);

       
fwrite($fp"새로운 내용을 작성합니다.");

       
// 작업을 마쳤으면 파일 잠금 해제합니다.
       
@flock($fpLOCK_UN;

       
fclose($fp);
 }
 
 
// 파일에 내용 추가시
 
if($fp = @fopen('readme.txt''ab'))
 {
       
// 파일을 먼저 잠금합니다.
       
@flock($fpLOCK_SH);

       
fwrite($fp"새로운 라인을 추가합니다.");

       
// 작업을 마쳤으면 파일 잠금 해제합니다.
       
@flock($fpLOCK_UN;
      
       
fclose($fp);
 }
 ?>


해당 파일에 접근하는 사용자수가 많다면 파일이 깨지는 경우가 발생하므로 반드시 파일 쓰기 작업일 때는 파일 잠금을 해두는게 좋으며 파일 읽기 일때는 flock 기능 보다는 readfile 함수나 fpassthru 함수를 이용하는 편이 더 효율적일 것입니다.


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

fopen 함수가 바이너리에 안전하지만 바이너리와 텍스트 파일을 구별할 수 있는 윈도우 시스템에서는 b 플래그는 중요합니다. 그리고 fopen 함수를 사용할때 fputs 함수나 fgets 함수 보다는 fread 함수나 fwrite 함수를 사용하는 것이 권장되며, 바이너리와 텍스트 파일을 구분하지 못하는 유닉스에서는 b 플래그가 필요치 않으나 윈도우환경에서는 중요한 부분입니다. 시스템환경이 바뀔 수 있는 부분이 있다면 b 플래그를 사용하는 것이 좋습니다.


fputs 함수나 fgets 함수로 바이너리로 열거나 작성하더라도 바이너리 자료를 유지하지 못하는  경우가 있으므로 바이너리 자료 그대로 유지되는 fread 함수나 fwrite 함수를 이용하는 것을 권고하고 있습니다.

 <?php
 
if($fp = @fopen('readme.txt''ab+')){
       
fwrite($fp"바이너리로 작성합니다.");
       
fclose($fp);
 }
 
 if(
$fp = @fopen('readme.txt''rb')){
       
fread($fp);
       ob_flush();
       
flush();
       
fclose($fp);
 } else {
     print(
'파일을 찾을 수 없습니다.');
 }
 ?>


관련글:2011/04/22 - [phP 함수 레퍼런스/파일 시스템 함수] - 파일 열기 fopen 함수



블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag fopen

댓글을 달아 주세요

int fputcsv ( resource $handle , array $fields [, string $delimiter [, string $enclosure ]] ) (PHP 5 >= 5.1.0)

fgetcsv 함수는 csv 파일의 내용을 읽어 오는 역할을 하고, fputcsv 함수는 csv 파일에 내용을 추가하는 역할을 합니다.

예제 (ex #1
 <?php
 if (!function_exists('fputcsv')) { 
   function 
fputcsv(&$handle$fields = array(), $delimiter ','$enclosure '"') {
    
$str '';
    
$escape_char '\\';
    foreach (
$fields as $value) {
      if (
strpos($value$delimiter) !== false ||
          
strpos($value$enclosure) !== false ||
          
strpos($value"\n") !== false ||
          
strpos($value"\r") !== false ||
          
strpos($value"\t") !== false ||
          
strpos($value' ') !== false) {
        
$str2 $enclosure;
        
$escaped 0;
        
$len strlen($value);
        for (
$i=0;$i<$len;$i++) {
          if (
$value[$i] == $escape_char) {
            
$escaped 1;
          } else if (!
$escaped && $value[$i] == $enclosure) {
            
$str2 .= $enclosure;
          } else {
            
$escaped 0;
          }
          
$str2 .= $value[$i];
        }
        
$str2 .= $enclosure;
        
$str .= $str2.$delimiter;
      } else {
        
$str .= $value.$delimiter;
      }
    }
    
$str substr($str,0,-1);
    
$str .= "\n";
    return 
fwrite($handle$str);
  }   
 } 

 $list 
= array (
    
'aaa,bbb,ccc,dddd'
,
    
'123,456,789'
,
    
'"aaa","bbb"'
 );

 $fp fopen('file.csv''w'
);
 foreach (
$list as $line
) {
    
fputcsv($fpsplit(','$line
));
 }

 fclose($fp
);
 ?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

array fgetcsv ( resource $handle [, int $length [, string $delimiter [, string $enclosure [, string $escape ]]]] ) (PHP 4, PHP 5)

CSV 필드에 대한 파일 포인터와 구문 라인을 가져 오며, CSV 파일중 빈 줄은 하나의 필드를 NULL로 구성된 배열로 반환되어 에러로 취급하지는 않습니다.

csv파일인 전세계 ip대역을 열어 보면 6개 필드로 이루어져 있음을 알 수 있습니다.


다음 예제로 csv파일로 구성된 전세계 ip을 읽어 오게 합니다.

예제(ex #1

 <?php
 $row 
1
;
 $handle fopen("GeoIPCountryWhois.csv""r"
);
 while ((
$data fgetcsv($handle1000",")) !== FALSE
) {
    
$num count($data
);
    echo 
"<p> $num fields in line $row: <br /></p>\n"
;
    
$row
++;
    for (
$c=0$c $num$c
++) {
        echo 
$data[$c] . "<br />\n"
;
    }
 }
 fclose($handle
);
 ?>

인터넷 브라우저로 확인해 보면 다음 그림처럼 <br>태그로 구분되어 출력되게 됩니다.


csv파일을 어떤 형태로 읽어 오는지를 확인하였으니, 디비에 입력하는 코드를 작성해 보겠습니다.

예제(ex #2
 <?php
 $row 
1
;
 $handle fopen("GeoIPCountryWhois.csv""r"
);
 while ((
$data fgetcsv($handle1000",")) !== false
) {
    
$num count($data
);
    echo 
"<p> $num fields in line $row: <br /></p>\n"
;
    
$row
++;

    
$sql false
;
    
$sql "INSERT INTO ".$table_name." VALUES ("
;

    for (
$c=0$c $num$c
++) {
        
$sql .= "'" $data[$c] . "'"
;
        if(
$c+!== $num
){
            
$sql .= ", "
;
        }
    }
    
$sql .= ");"
;

    echo 
"$sql<br />"
;
 }
 fclose($handle
);
 ?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag IP

댓글을 달아 주세요

임시 디렉토리에 0600 권한으로 임의의 이름을 가진 파일을 반환하는 함수가 tempnam 함수입니다.

string tempnam ( string $dir , string $prefix ) (PHP 4, PHP 5)

첫번째 인자는 임시 파일이 만들어질 임시 디렉토리입니다. 지정한 디렉토리가 없거나 쓰기권한이 없다면, 서버 임시 디렉토리로 기본 지정됩니다.

예제 (ex #1
 <?php
 
// tmpname 디렉토리가 존재하지 않기 때문에
 // 기본 임시 디렉토리에 파일이 생성됩니다.
 
$tmpfname tempnam("/tmpname""test_");
 echo 
$tmpfname// 결과: /tmp/test_oRIspu


 $tmpfname 
tempnam("./uploads""test_");
 echo 
$tmpfname// 결과: C:/Server/html/uploads/test_Jb1IYF  
 ?>

예제 (ex #2
 <?php
 $tmpfname 
tempnam("./uploads""test_"
); 
 $handle fopen($tmpfname"w");
           
fwrite($handle"writing to tempfile"
); 
          
fclose($handle
); 

 /*
 결과:
 writing to tempfile
 */

 
?>

서버 임시 디렉토리 위치가 잘 모르겠으면, 다음 함수를 사용하여 알아올 수도 있습니다.

예재 (ex #3
 <?php
 echo sys_get_temp_dir(); 
// 결과: /tmp
 ?>

예제 (ex #4
 <?php  
 
function tempnamsfx($path$suffix
) {  
    if((
is_dir($path) === true) && (is_writable($path) === true
)){ 
         
$tmpname $path

    } else { 
         
$tmpname sys_get_temp_dir
(); 
    } 
    
clearstatcache
(); 

    
$file md5_file(tempnam($tmpname$suffix
)); 
    return 
$file
;  
 }  

 $file tempnamsfx("/tmp""test");
 echo $file// 결과: d41d8cd98f00b204e9800998ecf8427e

 ?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

bool touch ( string $filename [, int $time= time() [, int $atime ]] ) (PHP 4, PHP 5)

이 함수는 파일 액세스, 수정시간을 강제로 수정하며, time 이나 atime 인자를 사용하지 않을 경우 현재 시간으로 설정합니다.

예제(ex #1

 <?php
 
// 액세스한 시간을 한 시간 전으로 되돌립니다.
 
$time time() - 3600
;

 if(!
touch('test.php'$time
)) {
      echo 
'수정 실패...'
;
 }else{
      echo 
'수정 완료...'
;
 }
 
?>


예제(ex #2

 <?php
 
if (touch('test.php'
)) {
      echo 
'수정 완료'
;
 } else {
      echo 
'수정 실패'
;
 }
 
?> 


예제(ex #3

 <?php
 
// 1초를 지연합니다.
 
touch('test.php'
);
 echo 
filemtime('index.php')."<br />\n"
// 결과: 1309248181
 
clearstatcache
();
 
sleep(1
);

 
// 1초를 지연합니다.
 
touch('test.php'
);
 echo 
filemtime('index.php')."<br />\n";  
// 결과: 1309248182
 
clearstatcache
();
 
sleep(1
);

 
// 3초를 지연합니다.
 
touch('test.php'
);
 echo 
filemtime('index.php')."<br />\n"
// 결과: 1309248183
 
clearstatcache
();
 
sleep(3
);

 
// 2초를 지연합니다.
 
touch('test.php'
);
 echo 
filemtime('index.php')."<br />\n"
// 결과: 1309248186
 
clearstatcache
();
 
sleep(2
);

 
touch('test.php'
);
 echo 
filemtime('index.php')."<br />\n"
// 결과: 1309248188
 
clearstatcache
();
 
?>


참고로 filectime() 함수는 파일 변경시간을, filemtime() 함수는 수정시간을 정수로 가져옵니다.

예제(ex #4

 <?php
 
echo filectime ('test.php')."<br />\n"
// 결과: 1309249648
 
clearstatcache
();
 
sleep(1
);

 echo 
filemtime ('test.php')."<br />\n"
// 결과: 1309249648
 
clearstatcache
();
 
sleep(1
);

 
// 파일을 수정합니다.
 
$fp fopen('test.php''a'
);
 if(
is_resource($fp
)){
      
fwrite($fp'test'
);
      
fclose($fp
);
 } 

 
// 강제 변경합니다.
 
touch('test.php'
);


 echo 
filemtime ('test.php')."<br />\n"
// 결과: 1309249683
 
clearstatcache
();
 
sleep(1
);

 echo 
filemtime ('test.php')."<br />\n"
// 결과: 1309249683
 
clearstatcache
();
 
sleep(1
);

 echo 
filectime ('test.php')."<br />\n"
// 결과: 1309249683
 
clearstatcache
();
 
sleep(1
);
 
?>


물론 액세스한 시간이나 기타 정보를 가져 올 수 있는 stat() 함수도 있습니다.

이 함수는 다음 표의 정보를 배열로 가져옵니다.
 

배열 키

내 용

dev

device number, 함수명: fstat()

ino

inode number, 함수명: lstat(), fstat()

mode

inode 보호 모드, 함수명: lstat(), fstat()

nlink

링크 번호, 함수명: fstat()

uid

소유자 사용자 id, 함수명: fstat()

gid

소유자 그룹 id, 함수명: fstat()

rdev

디바이스 타입

size

파일 크기, 함수명: lstat(), fstat()

atime

엑세스 시간, 타임스탬프, 함수명: lstat(), fstat()

mtime

수정 시간, 타임스탬프, 함수명: lstat(), fstat()

ctime

변경 시간, 타임스탬프, 함수명: lstat(), fstat()

blksize

최적의 블럭 크기, 함수명: fstat()

blocks

할당된 블럭의 수, 함수명: lstat(), fstat()


예제(ex #5
 <?php
 $info 
stat('test.php'
);

 
print_r($info
);
 
/*
 결과:
 Array
 (
    [0] => 2066
    ...

    [dev] => 2066
    [ino] => 203029047
    [mode] => 33279
    [nlink] => 1
    [uid] => 2696
    [gid] => 500
    [rdev] => 0
    [size] => 2661
    [atime] => 1309249269
    [mtime] => 1309248657
    [ctime] => 1309248657
    [blksize] => 4096
    [blocks] => 8
 )
 */
 
?>

예제(ex #6

 <?php
 
function ustat($file
) {
      
clearstatcache
();

      
$ss=@stat($file
);
      if(!
$ss
) {
           return 
false
;
      }
 
      
$ts
=array(
            
0140000=>'ssocket'
,
            
0120000=>'llink'
,
            
0100000=>'-file'
,
            
0060000=>'bblock'
,
            
0040000=>'ddir'
,
            
0020000=>'cchar'
,
            
0010000=>
'pfifo'
      
);
 
      
$p $ss['mode'
];
      
$t decoct($ss['mode'] & 0170000
);

      
$str=(array_key_exists(octdec($t),$ts))?$ts[octdec($t)]{0}:'u'
;
      
$str.=(($p&0x0100)?'r':'-').(($p&0x0080)?'w':'-'
);
      
$str.=(($p&0x0040)?(($p&0x0800)?'s':'x'):(($p&0x0800)?'S':'-'
));
      
$str.=(($p&0x0020)?'r':'-').(($p&0x0010)?'w':'-'
);
      
$str.=(($p&0x0008)?(($p&0x0400)?'s':'x'):(($p&0x0400)?'S':'-'
));
      
$str.=(($p&0x0004)?'r':'-').(($p&0x0002)?'w':'-'
);
      
$str.=(($p&0x0001)?(($p&0x0200)?'t':'x'):(($p&0x0200)?'T':'-'
));

      if(
function_exists('posix_getpwuid'
)){
           
$oid = @posix_getpwuid($ss['uid'
]);
      } else {
           
$oid false
;
      }
      if(
function_exists('posix_getgrgid'
)){
           
$gid = @posix_getgrgid($ss['gid'
]);
      } else {
           
$gid false
;
      }
 



      
$info 
= array();

      
$info 
= array(
           
'perms'
=>array(
                
'umask'=>sprintf("%04o",@umask
()),
                
'human'=>$str
,
                
'octal1'=>sprintf("%o", ($ss['mode'] & 000777
)),
                
'octal2'=>sprintf("0%o"0777 $p
),
                
'decimal'=>sprintf("%04o"$p
),
                
'fileperms'=>@fileperms($file
),
                
'mode1'=>$p
,
                
'mode2'=>$ss['mode'
]),
 
           
'owner'
=>array(
                
'fileowner'=>$ss['uid'
],
                
'filegroup'=>$ss['gid'
],
                
'owner'=> $oid
,
                
'group'=> 
$gid
           
),

           
'file'
=>array(
                
'filename'=>$file
,
                
'realpath'=>(@realpath($file) != $file) ? @realpath($file) : ''
,
                
'dirname'=>@dirname($file
),
                
'basename'=>@basename($file
)
           ),

           
'filetype'
=>array(
                 
'type'=>substr($ts[octdec($t)],1
),
                 
'type_octal'=>sprintf("%07o"octdec($t
)),
                 
'is_file'=>@is_file($file
),
                 
'is_dir'=>@is_dir($file
),
                 
'is_link'=>@is_link($file
),
                 
'is_readable'=> @is_readable($file
),
                 
'is_writable'=> @is_writable($file
)
           ),
  
           
'device'
=>array(
                 
'device'=>$ss['dev'], 
//Device
                 
'device_number'=>$ss['rdev'], 
//Device number, if device.
                 
'inode'=>$ss['ino'], 
//File serial number
                 
'link_count'=>$ss['nlink'], 
//link count
                 
'link_to'=>($s['type']=='link') ? @readlink($file) : 
''
            
),
 
           
'size'
=>array(
                 
'size'=>$ss['size'], 
//Size of file, in bytes.
                 
'blocks'=>$ss['blocks'], 
//Number 512-byte blocks allocated
                 
'block_size'=> $ss['blksize'
//Optimal block size for I/O.
            
), 
 
           
'time'
=>array(
                 
'mtime'=>$ss['mtime'
],
                 
'atime'=>$ss['atime'
],
                 
'ctime'=>$ss['ctime'
],
                 
'accessed'=>@date('Y M D H:i:s',$ss['atime'
]),
                 
'modified'=>@date('Y M D H:i:s',$ss['mtime'
]),
                 
'created'=>@date('Y M D H:i:s',$ss['ctime'
])
            ),
      );
 
      
clearstatcache
();
      return 
$info
;
 }


 
$info ustat("test.php"
);

 
print_r($info
);

 
/*
 결과:
 Array
 (
    [perms] => Array
        (
            [umask] => 0022
            [human] => -rw-r--r--
            [octal1] => 644
            [octal2] => 0644
            [decimal] => 100644
            [fileperms] => 33188
            [mode1] => 33188
            [mode2] => 33188
        )

    [owner] => Array
        (
            [fileowner] => 2696
            [filegroup] => 500
            [owner] => Array
                (
                    [name] => root
                    [passwd] => x
                    [uid] => 2696
                    [gid] => 500
                    [gecos] => 
                    [dir] => /Server/html
                    [shell] => /bin/bash
                )

            [group] => Array
                (
                    [name] => host
                    [passwd] => x
                    [members] => Array
                        (
                        )

                    [gid] => 500
                )
        )

    [file] => Array
        (
            [filename] => test.php
            [realpath] => /Server/html/test.php
            [dirname] => .
            [basename] => test.php
        )

    [filetype] => Array
        (
            [type] => file
            [type_octal] => 0100000
            [is_file] => 1
            [is_dir] => 
            [is_link] => 
            [is_readable] => 1
            [is_writable] => 
        )

    [device] => Array
        (
            [device] => 2066
            [device_number] => 0
            [inode] => 201882963
            [link_count] => 1
            [link_to] => 
        )

    [size] => Array
        (
            [size] => 2720
            [blocks] => 8
            [block_size] => 4096
        )

    [time] => Array
        (
            [mtime] => 1309252725
            [atime] => 1309252730
            [ctime] => 1309252725
            [accessed] => 2011 Jun Tue 18:18:50
            [modified] => 2011 Jun Tue 18:18:45
            [created] => 2011 Jun Tue 18:18:45
        )
 )
 */
 
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

mixed pathinfo ( string $path [, int $options= PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ] ) (PHP 4 >= 4.0.3, PHP 5)

이 함수는 두번째 인자를 생략할 경우 파일경로와 파일명, 확장자를 배열로 반환합니다. 파일이름([filename])은 [PHP 5.2.0] 부터 사용할 수 있습니다.

예제 (ex #1

 <?php
 $path_parts 
pathinfo('/www/htdocs/www//index.html'
);
 
print_r($path_parts
);
 
/*
 결과:
 Array
 (
    [dirname] => /www/htdocs/www
    [basename] => index.html
    [extension] => html
    [filename] => index
 )
 */


 
$path_parts pathinfo('/www/htdocs/www/index.php.asp.bmp.html.inc'
);
 
print_r($path_parts
);
 
/*
 결과:
 Array
 (
    [dirname] => /www/htdocs/www
    [basename] => index.php.asp.bmp.html.inc
    [extension] => inc
    [filename] => index.php.asp.bmp.html
 )
 */


 
$path_parts pathinfo('/www/htdocs/www/index'
);
 
print_r($path_parts
);
 
/*
 결과:
 Array
 (
    [dirname] => /www/htdocs/www
    [basename] => index
    [extension] => 
    [filename] => index
 )
 */
 
?>


다음은 두번째 인자를 이용한 파일 업로드시 활용 예제입니다.

예제 (ex #2
  <?php
 
if($_FILES['file']['error'] === UPLOAD_ERR_OK
) {
      
// 확장자를 반환받습니다.
      
if(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION) == "php"
) {
           echo 
"확장자 php파일은 업로드 하실수 없습니다."
;
      }
 }
 
?>

두번째 인자는 다음 표의 상수를 사용할 수 있습니다.

 PATHINFO_DIRNAME

 파일경로, [dirname] =>/www/htdocs/www

 PATHINFO_BASENAME  파일명, [basename] => index.html
 PATHINFO_EXTENSION  파일 확장자, [extension] => html
 PATHINFO_FILENAME   파일이름, [filename] => index

예제 (ex #3

 <?php
 
// 파일경로
 
$path_parts pathinfo('/www/htdocs/www///index.php.asp.bmp.html.inc',PATHINFO_DIRNAME
);
 echo 
$path_parts
// 결과: /www/htdocs/www
 // dirname함수도 같은 역할을 합니다.
 
echo dirname('/www/httpd/home/index.html'); 
// 결과: /www/httpd/home



 // 파일명
 
$path_parts pathinfo('/www/htdocs/www///index.php.asp.bmp.html.inc',PATHINFO_BASENAME
);
 echo 
$path_parts
// 결과: index.php.asp.bmp.html.inc
 // basename함수도 같은 역할을 합니다.
 
echo basename('/www/httpd/home/index.html'); 
// 결과: index.html
 // 두번째 인자를 사용할 수 있습니다.
 
echo basename('/www/httpd/home/index.html'".html"); 
// 결과: index




 // 파일 확장자
 
$path_parts pathinfo('/www/htdocs/www///index.php.asp.bmp.html.inc',PATHINFO_EXTENSION
);
 echo 
$path_parts
// 결과: inc




 // 파일이름
 
$path_parts pathinfo('/www/htdocs/www///index.php.asp.bmp.html.inc',PATHINFO_FILENAME
);
 echo 
$path_parts
// 결과: index.php.asp.bmp.html
 
?>


상대경로를 절대경로로 반환하는 realpath 함수

string realpath ( string $path ) (PHP 4, PHP 5)

예제 (ex #4
 <?php
 
echo realpath('./../../etc/passwd'); 
// 결과: /etc/passwd

 
echo realpath('/windows/system32'); 
// 결과: C:\WINDOWS\System32
 
?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

[펌]괜찮은 소스가 있어 올려 봅니다.

 <?php
 
function file_size($size
) {
      
$sizes = array(" Bytes"" KB"" MB"" GB"" TB"" PB"" EB"" ZB"" YB"
);
      if (
$size == 0
) {
           return(
'n/a'
);
      } else {
           return (
round($size/pow(1024, ($i floor(log($size1024)))), 2) . $sizes[$i
]);
      }
 }

 
 
$filesize filesize("test_move.avi"); 
// 파일크기: 123520000
 
$size file_size($filesize
);

 echo 
$size
// 결과: 117.8 MB
 
?>

출처: http://kr2.php.net/manual/en/function.filesize.php
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

int ftell ( resource $handle ) (PHP 4, PHP 5)

이 함수는 인자로 전달받은 파일 포인터가 가리키는 위치를 반환하는데, 성공하면 바이트 수로 계산된 정수를, 실패하면 false를 반환합니다.

예제 (ex #1

 <?php
 
/*
 test.txt파일 내용
 1. 안녕하세요. 하보니입니다.
 2. rewind함수 테스트입니다.
 3. 1234567890
 4. abcdefghijklmnopqrstuq
 5. asdfghjkl
 6. qwertyuiop
 7. qwertyuiop.BMP
 */

 
if($fp = @fopen("test.txt""r"
)){
      echo 
"현제 파일포인터 위치: " ftell($fp) . "<br />\n"
;
      
// 결과: 현제 파일포인터 위치: 0

      
echo fgets($fp1024) . "<br />\n"
;
      
// 결과: 1. 안녕하세요. 하보니입니다.

      
echo "현제 파일포인터 위치: " ftell($fp) . "<br />\n"
;
      
// 결과: 현제 파일포인터 위치: 30

      
echo fgets($fp1024) . "<br />\n"
;
      
// 결과: 2. rewind함수 테스트입니다.

      
echo "현제 파일포인터 위치: " ftell($fp) . "<br />\n"
;
      
// 결과: 현제 파일포인터 위치: 59

      
echo fgets($fp1024) . "<br />\n"
;
      
// 결과: 3. 1234567890

     
fclose($fp
);
 }
 
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag fopen

댓글을 달아 주세요

int fseek ( resource $handle , int $offset [, int $whence ] ) (PHP 4, PHP 5)

이 함수는 두 번째 인자와 세 번째 인자에 의해 결정되는 새로운 위치로 이동 시킵니다. offset인자는 파일의 처음위치부터 byte수로 계산되는 값입니다. 성공시 "0"을, 실패시 "-1"를 반환하며, 세번째 인자는 다음 표와 같은 상수를 사용합니다.

 SEEK_SET 파일 포인터 첫 위치에서 offset 바이트만큼 위치로 이동합니다.
 SEEK_CUR 현제 파일 포인터의 위치에서 offset 바이트만큼 위치로 이동합니다.
 SEEK_END 파일 포인터 마지막 위치에서 offset 바이트만큼 위치로 이동합니다.

SEEK_END상수는 마지막위치에서 offset만큼 바이트수로 계산되기 때문에 음수를 지정하며, 세 번째 인자를 생략할 경우 SEEK_SET로 간주하여 실행하게 됩니다.

예제 (ex #1

 <?php
 
/*
 test.txt파일 내용
 1. 안녕하세요. 하보니입니다.
 2. rewind함수 테스트입니다.
 3. 1234567890
 4. abcdefghijklmnopqrstuq
 5. asdfghjkl
 6. qwertyuiop
 7. qwertyuiop.BMP
 */

 
$file 'test.txt'
;
 if(
$fp fopen($file,'r'
)){
    if(
is_resource($fp
)){

        
// 1024는 한줄을 읽어 오게 해줍니다.
        
if($fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
);
        }

        
// 포인터 처음 위치에서 offset 2만큼 이동후 출력합니다.
        
fseek($fp,2
);
        if(
$fname fgets($fp,1024
)){
            echo 
$fname ."<br />\n"
);
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }

        
// 포인터 처음 위치에서 offset 3만큼 이동후 출력합니다.
        // 포인터 첫 위치부터 다시 출력합니다.
        
fseek($fp,3,SEEK_SET
);
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }

        
// 현제 포인터 위치에서 offset 3만큼 이동후 출력합니다.
        
fseek($fp,3,SEEK_CUR
);
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        } 
    } 
// end is_resource
    
fclose($fp
);
 } 
// end fp

 /* 결과:
 1. 안녕하세요. 하보니입니다. 
 안녕하세요. 하보니입니다.
 2. rewind함수 테스트입니다. 
 3. 1234567890 
 4. abcdefghijklmnopqrstuq 
 안녕하세요. 하보니입니다.
 2. rewind함수 테스트입니다. 
 3. 1234567890 
 4. abcdefghijklmnopqrstuq 
 asdfghjkl
 6. qwertyuiop 
 */
 
?>


SEEK_END상수를 사용한 예입니다.

예제 (ex #2

  <?php
 
/*
 test.txt파일 내용
 1. 안녕하세요. 하보니입니다.
 2. rewind함수 테스트입니다.
 3. 1234567890
 4. abcdefghijklmnopqrstuq
 5. asdfghjkl
 6. qwertyuiop
 7. qwertyuiop.BMP
 */

 
$file 'test.txt'
;
 if(
$fp fopen($file,'r'
)){
    if(
is_resource($fp
)){

        
// 1024는 한줄을 읽어 오게 해줍니다.
        
if($fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
);
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
);
        }

        
// 끝에서 3문자만 출력합니다.
        
fseek($fp,-3,SEEK_END
);
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
    } 
// end is_resource
    
fclose($fp
);
 } 
// end fp
 
 /* 결과:
 1. 안녕하세요. 하보니입니다. 
 2. rewind함수 테스트입니다. 
 BMP
 */
 
?>


예제 (ex #3

<?php
 
/*
 test.txt파일 내용
 1. 안녕하세요. 하보니입니다.
 2. rewind함수 테스트입니다.
 3. 1234567890
 4. abcdefghijklmnopqrstuq
 5. asdfghjkl
 6. qwertyuiop
 7. qwertyuiop.BMP
 */

 
$file 'test.txt'
;
 if(
$fp fopen($file,'r'
)){
    if(
is_resource($fp
)){

        
// 1024는 한줄을 읽어 오게 해줍니다.
        
if($fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
);
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
);
        }

        
// 끝에서 10문자만 출력합니다.
        
fseek($fp,-10,SEEK_END
);
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }

        
// 포인터 처음 위치에서 offset 3만큼 이동후 출력합니다.
        // 포인터 첫 위치부터 다시 출력합니다.
        
fseek($fp,3,SEEK_SET
);
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }  
    } 
// end is_resource
    
fclose($fp
);
 } 
// end fp
 
 /* 결과:
 1. 안녕하세요. 하보니입니다. 
 2. rewind함수 테스트입니다. 
 tyuiop.BMP
 안녕하세요. 하보니입니다. 
 2. rewind함수 테스트입니다. 
 3. 1234567890 
 4. abcdefghijklmnopqrstuq 
 5. asdfghjkl 
 6. qwertyuiop
 */
 
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag fopen

댓글을 달아 주세요

bool rewind ( resource $handle ) (PHP 4, PHP 5)

fgets함수는 파일내 내용을 지정 크기만큼 읽어 들여 순서대로 출력하는데, 이를 처음 상태로 되돌리는 함수가 rewind입니다. rewinddir함수와 동일한 기능을 합니다.

예제 (ex #1

  <?php
 
/*
 test.txt 파일내용
 1. 안녕하세요. 하보니입니다.
 2. rewind함수 테스트입니다.
 3. 1234567890
 4. abcdefghijklmnopqrstuq
 5. asdfghjkl
 6. qwertyuiop
 */

 
$file 'test.txt'
;
 if(
$fp fopen($file,'r'
)){
    if(
is_resource($fp
)){

        
// 1024는 한 줄을 읽어 오게 해줍니다.
        
if($fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }

        
// 포지션을 처음 상태로 되돌립니다.
        
rewind($fp
);
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }
        if(
$fname fgets($fp,1024
)){
            echo 
$fname."<br />\n"
;
        }    
    } 
// end is_resource
    
fclose($fp
);
 } 
// end fp

 /*
 결과:
 1. 안녕하세요. 하보니입니다. 
 2. rewind함수 테스트입니다. 
 3. 1234567890 
 4. abcdefghijklmnopqrstuq 
 5. asdfghjkl 
 6. qwertyuiop 
 1. 안녕하세요. 하보니입니다. 
 2. rewind함수 테스트입니다. 
 */
 
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag fopen

댓글을 달아 주세요

bool rewinddir ( resource $handle ) (PHP 4, PHP 5)

readdir함수는 디렉토리내 존재하는 파일의 목록을 만들어 하나씩 순서대로 출력될 때마다  리소스($fp)의 크기가 줄어 들게 되는데, 이를 처음 상태로 되돌리는 함수가 rewinddir입니다.

예제 (ex #1
  <?php
 $dir 
'./mail'
;
 if(
$fp opendir($dir
)){
      if(
is_resource($fp
)){

           if(
$fname readdir($fp
)){
                
// 결과: file: .
                
echo "file: ".$fname."<br/>\n"
;
           }
           if(
$fname readdir($fp
)){
                
// 결과: file: ..
                
echo "file: ".$fname."<br/>\n"
;
           }
           if(
$fname readdir($fp
)){
                
// 결과: file: Mail
                
echo "file: ".$fname."<br/>\n"
;
           }
           if(
$fname readdir($fp
)){
                
// 결과: file: Mail.php
                
echo "file: ".$fname."<br/>\n"
;
           }
           if(
$fname readdir($fp
)){
                
// 결과: file: package.xml
                
echo "file: ".$fname."<br/>\n"
;
           }

           
// 포지션을 처음 상태로 되돌립니다.
           
rewinddir($fp
);
           if(
$fname readdir($fp
)){
                
// 결과: file: .
                
echo "file: ".$fname."<br/>\n"
;
           }
           if(
$fname readdir($fp
)){
                
// 결과: file: ..
                
echo "file: ".$fname."<br/>\n"
;
           }
           if(
$fname readdir($fp
)){
                
// 결과: file: Mail
                
echo "file: ".$fname."<br/>\n"
;
           }
      } 
// end is_resource

      
closedir($fp
);
 } 
// end fp
 
?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

php에서는 copy함수를 이용하여 간단하게 파일을 복사하거나 unlink(또는 delete)함수로 파일을 삭제할 수 있습니다. 이 두 함수는 복사, 삭제에 성공할 경우 true를, 실패하면 오류 코드 메시지를 표시하므로 함수 앞에 @를 붙여 보안 유효성을 높여 주도록 합니다.

bool copy ( string $source , string $dest [, resource $context ] ) (PHP 4, PHP 5)

 copy(원본 파일명, 복사 파일명);
 unlink(삭제 파일명);

대상 파일이 이미 존재하면 덮어 쓰는 점에 주의가 필요합니다. 다음은 파일 복사 예제입니다.

예제 (ex #1

 <?php
 
// test.php파일을 복사본 test.php.bak로 만듭니다.
 
$oldfile 'test.php'
// 원본파일
 
$newfile 'test.php.bak'
// 복사파일

 // 실제 존재하는 파일인지 체크...
 
if(file_exists($oldfile
)) {
      if(!
copy($oldfile$newfile
)) {
            echo 
"파일 복사 실패"
;
      } else if(
file_exists($newfile
)) {
            echo 
"파일 복사 성공"
;
      }
 }
 
?>


다음은 파일 이동 예제입니다.

예제 (ex #2

 <?php
 
// test.php파일을 test.txt로 만듭니다.
 
$oldfile 'test.php'
// 원본파일
 
$newfile 'test.txt'
// 복사파일

 // 실제 존재하는 파일인지 체크...
 
if(file_exists($oldfile
)) {
      if(!
copy($oldfile$newfile
)) {
            echo 
"파일 복사에 실패하였습니다."
;
      } else if(
file_exists($newfile
)) {
            
// 복사에 성공하면 원본 파일을 삭제합니다.
            
if(!@unlink($oldfile
)){
                 if(@
unlink($newfile
)){
                      echo 
"파일이동에 실패하였습니다."
;
                 }
            }
      }
 }
 
?>


단순히 파일이름만 변경 원할 경우 rename함수를 이용하면 됩니다. 이 함수는 파일(또는 폴더)의 이름을 변경합니다. 성공하면 true를, 실패하면 false를 반환합니다.

bool
rename ( string $oldname , string $newname [, resource $context ] ) (PHP 4, PHP 5)

예제 (ex #3

 <?php
 
// dir1 폴더를 dir2폴더로 이름을 변경합니다.
 
if(rename("dir1","dir2"
)){
     echo 
"이름 변경 성공"
;
 }

 
// file1.php을 file2.php로 이름을 변경합니다.
 
if(rename("file1.php","file2.php"
)){
     echo 
"이름 변경 성공"
;
 }
 
?>


단순히 copy, unlink함수를 이용하지 않고, fopen함수로 표현이 가능합니다. 다음이 그 좋은 예입니다.

예제 (ex #4

 <?php
 
// test.php파일을 복사본 test.php.bak로 만듭니다.
 
$oldfile 'test.php'
// 원본파일
 
$newfile 'test.php.bak'
// 복사파일

 
if(file_exists($oldfile
)) {
      
$data file_get_contents($oldfile
);
      
$fp fopen($newfile'w+'
);
      if(
is_resource($fp
)){
            
fputs($fp$data
);
      }
      
fclose($fp
);
 }
 
?>


예제 (ex #5

 <?php
 
// test.php파일을 복사본 test.php.bak로 만듭니다.
 
$oldfile 'test.php'
// 원본파일
 
$newfile 'test.php.bak'
// 복사파일

 
if(file_exists($oldfile
)) {
     
$fold fopen($oldfile,'r'
); 
     if(
is_resource($fold
)){
            
$fnew fopen($newfile,'w+'
); 
            
$len stream_copy_to_stream($fold,$fnew
); 
            
fclose($fold
); 
            
fclose($fnew
); 
     }
 }
 
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

파일 쓰기 함수에는 보통 fwritefputs함수를 사용합니다. fwrite는 바이너리로 작성한다는 점 말고는 fputs와의 차이는 없습니다. 그리고 length를 비워두면 내용 전체를 파일에 기록합니다.

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

예제 (ex #1

 <?php
 $fp 
fopen('test.txt''a+'
);
 
fwrite($fp'1'
);
 
fwrite($fp'23'
);
 
fclose($fp
);
 ?>


예제 (ex #2

 <?php
 
// 기록할 내용입니다.
 
$string "fwrite함수를 사용하여 파일에 기록합니다.\n"
;

 
$filename 'test.txt'
;
 
$fp fopen($filename,'a+'); 
// 열기
 
for ($i 0$i strlen($string); $i += $int
) {
        
$int fwrite($fpsubstr($string$i)); 
// 쓰기
 
}
 
fclose($fp); 
// 닫기
 ?>


예제 (ex #3

 <?php
 $filename 
'test.txt'
;
 
$string "파일에 작성하기\n"
;

 
// 쓰기 가능한 파일인지 확인합니다.
 
if (is_writable($filename
)) {

    if (!
$handle fopen($filename'a'
)) {
         exit(
"파일을 오픈할 수가 없습니다."
);
    }

    if (
fwrite($handle$string) === FALSE
) {
        exit(
"파일에 작성할 수 없습니다."
);
    }

    echo 
"파일에 정상적으로 작성하였습니다."
;

    
fclose($handle
);

 } else {
    echo 
"쓰기 가능한 파일이 아닙니다. 퍼미션을 확인하십시요."
;
 }
 
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag 퍼미션

댓글을 달아 주세요


파일을 읽어 오기 위한 함수로는 file함수, fread함수, fgets함수가 있습니다. 이 함수의 역할은 다음 표를 참고할 수 있습니다.

 함수  의미
 file 파일 전체를 읽어 배열로 반환합니다.
 fread 한줄(또는 전체)를 바이너리로 읽어 옵니다.
 fgets 파일 포인터에서 한 줄을 읽어옵니다.
 fgetc 파일 포인터에서 한 문자씩 읽어 옵니다.
 fgetss 파일 포인터에서 한줄을 읽어서 Html, Php태그를 제거합니다.
 fgetcsv 파일의 현제 위치에서 CSV필드로 된줄을 읽어와서 파싱합니다.

file 함수

array file ( string $filename [, int $flags= 0 [, resource $context ]] ) (PHP 4, PHP 5)

예제 (ex #1
 <?php
 $arr 
file('test.txt'
);
 foreach(
$arr as $v
){
      echo 
$v
;
 }
 
?>

이 함수는 다음 상수를 사용할 수 있습니다.

 상수명  의미
 FILE_BINARY  바이너리로 읽어 옵니다. (PHP 5.2.7부터)
 FILE_TEXT
 UTF-8인코딩으로 읽어 옵니다. (PHP 5.2.7부터)
 FILE_IGNORE_NEW_LINES  개행처리되지 않은 문자를 반환합니다.
 FILE_SKIP_EMPTY_LINES 
 

예제 (ex #2
 <?php
 
// 비어 있는 라인이나 개행처리 되지 않은 값을 반환받습니다.
 
$arr file('test.txt'FILE_IGNORE_NEW_LINES FILE_SKIP_EMPTY_LINES
);
 foreach(
$arr as $v
){
      echo 
$v
;
 }
 
?>

예제 (ex #3
 <?php
 
// 바이너리로 읽어 옵니다.
 
$arr file('test.txt'FILE_BINARY
);
 foreach(
$arr as $v
){
      echo 
$v
;
 }
 
?>

fread 함수

이 함수를 사용하기 위해서는 반드시 파일을 열고, 읽고, 닫아 주어야 합니다.

예제 (ex #4
 <?php
 $filename 
'test.txt'
;
 
$fp fopen($filename'r');  
// 열기
 // filesize로 파일크기를 읽어들여 그 크기만큼 작성합니다.
 
$arr fread($fpfilesize($filename)); 
// 읽기
 
echo $arr
;
 
fclose($fp); 
// 닫기
 
?>

fgetc 함수

string fgetc ( resource $handle ) (PHP 4, PHP 5)

이 함수는 한 문자씩 읽어 반환하고, 파일의 끝부분까지 포인터의 포지션을 1만큼 증가시킵니다.

예제 (ex #5

 <?php
 
/*
  test.txt
  habony 함수
 */
 
$filename 'test.txt'
;
 
$fp fopen($filename'r'
);
 if (
$fp
) {
      while (
false !== ($char fgetc($fp
))) {
            echo 
$char."\n"
;
      }
 }
 
fclose($fp
);

 
/*
 결과:
 h
 a
 b
 o
 n
 y
 함
 수
 */
 
?>


fgetss 함수

string fgetss ( resource $handle [, int $length [, string $allowable_tags ]] ) (PHP 4, PHP 5)

예제 (ex #6

 <?php
 
/*
 test.txt
 <html><body>
 <p>Welcome! Today is the <?php echo(date('jS')); ?> of <?= date('F'); ?>.</p>
</body></html>
 */

 
$handle fopen("test.txt""r"
);
 if (
$handle
) {
    while (!
feof($handle
)) {
        
$buffer fgetss($handle1024
);
        echo 
$buffer
;
    }
    
fclose($handle
);
 }

 
/*
 결과:
 Welcome! Today is the  of .
 */
 
?>

 
블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag 퍼미션

댓글을 달아 주세요

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

이 함수는 호스트의 파일을 열거나 새로 만듭니다.
첫 번째 인자는 파일명 또는 절대경로를 입력하고, 두 번째 인자는 다음 표의 모드를 사용할 수 있습니다.

  모 드       의 미
 r 읽기 전용으로 오픈합니다.
 r+ 읽기와 쓰기 모드로 오픈합니다.
 w 쓰기 전용으로 오픈합니다. 기존 파일 내용은 완전히 지워지고, 새로 만듭니다. 파일이  존재하지 않는다면 새로 만듭니다.
 w+ 읽기와 쓰기 모드로 오픈합니다. 기존 파일 내용은 완전히 지워지고, 새로 만듭니다. 파일이  존재하지 않는다면 새로 만듭니다.
 a 내용 추가, 파일의 끝에 내용을 추가합니다. 파일이 존재하지 않는다면 새로 만듭니다.
 a+ 내용 추가와 읽기모드로 오픈하여 파일의 끝에 내용을 추가합니다. 파일이  존재하지 않는다면 새로 만듭니다.
 b 바이너리모드로 오픈합니다. 윈도우환경에서는 필수 모드

다음은 바이너리 그림 출력예제입니다.

예제 (ex #1
 <?php
 
// rb -> 읽기전용, 바이너리로 오픈합니다.
 
if($fp fopen('logo.gif''rb'
)){
     
// 바이너리로 읽기
     // 파일 포인터로 지정된 파일에서 최대 길이 1024*100 만큼 브라우저로 출력합니다.
      
print(fread($fp,1024*100
));
      
flush
();
      
// 파일을 오픈하면, 다른 스크립트에서  이용할 수 있도록 반드시 파일 포인터를 닫아야 합니다.
      
fclose($fp
);
 } else {
     print(
'파일을 찾을 수 없습니다.'
);
 }
 
?>

예제 (ex #2

 <?php
 $filename 
'test.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함수는 처음 파일 포인터에서 끝까지의 파일 내용을 읽어 표준 출력으로 보냅니다.

예제 (ex #3
 <?php
 
// 읽기전용으로 오픈합니다.
 
if($fp fopen('readme.txt''rb'
)){
       
fpassthru($fp
);
       
flush
();
       
fclose($fp
);
 } else {
     print(
'파일을 찾을 수 없습니다.'
);
 }
 
?>


관련글: 2013/06/07 - [phP 함수 레퍼런스/파일 시스템 함수] - fopen 함수의 b flag 문제


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

array glob ( string $pattern [, int $flags= 0 ] ) (PHP 4 >= 4.3.0, PHP 5)

이 함수는 pattern에 매칭되는 파일(또는 디렉토리)를 찾는데, *와 ?를 사용할 수 있습니다.

 * 매칭되는 모든 문자를 찾음
 ? 매칭되는 임의의 문자 1개를 찾음
 {a,b,c} 다중 패턴에 매칭되는 문자를 찾음

flags인자에 다음 표의 상수를 사용할 수 있습니다.

 GLOB_ONLYDIR 주어진 패턴에 매칭되는 폴더만 찾음
 GLOB_MARK 주어진 패턴에 매칭되는 폴더, 파일을 찾으며, 폴더는 끝에 역슬레쉬(\)가 붙음
 GLOB_BRACE 주어진 다중 패턴에 매칭되는 폴더, 파일을 찾음. {a,b,c}
 GLOB_NOSORT 주어진 패턴에 매칭되는 폴더, 파일을 찾고, 정렬하지 않은 목록을 반환함

예제 (ex #1
 <?php

 
// .로 시작하는 파일(또는 폴더)을 찾습니다.
 
$j 1
;
 foreach(
glob(".*") as $value
){
     echo 
"${j}) $value<br/>"
;
     
$j
++;
 }

 
/*
 결과:
 1) .
 2) ..
 3) .htaccess
 */


 // 확장자 .php파일을 찾습니다.
 
$j 1
;
 foreach(
glob("*.php") as $value
){
     echo 
"${j}. $value<br/>"
;
     
$j
++;
 }
 
/*
 결과:
 1. PHPTelnet.php
 2. index.php
 3. test.php
 4. xmlrpc.php
 */


 
$j 1
;
 foreach(
glob("k*.htm?") as $value
){
     echo 
"${j}. $value<br/>"
;
     
$j
++;
 }
 
/*
 결과:
 1. kara.html
 2. keight.htmp
 2. keight.htms
 */

 
$j 1
;
 foreach(
glob('my/*/dir/*.php') as $value
){
     echo 
"${j}. $value<br/>"
;
     
$j
++;
 }
 
/*
 결과:
 my/1/dir/xyz.php
 my/bar/dir/bar.php
 my/bar/dir/foo.php 
 */
 
?>

GLOB_ONLYDIR 상수

예제 (ex #2
 <?php
 
// 모든 문자를 포함하는 폴더를 찾습니다.
 
$j 1
;
 foreach(
glob("*",GLOB_ONLYDIR) as $value
){
     echo 
"${j}. $value<br/>"
;
     
$j
++;
 }

 
/*
 결과:
 1. 1212038247-PHPDebug-V1.1.0[1]
 2. 6694-notftp-1.2.1[1]
 3. File_Archive
 4. html_parse
 5. mail
 6. nbuilder11.6
 7. php souse
 8. rar
 9. rb
 */


 // r로 시작하는 폴더를 찾습니다.
 
$j 1
;
 foreach(
glob("r*",GLOB_ONLYDIR) as $value
){
     echo 
"${j}. $value<br/>"
;
     
$j
++;
 }
 
/*결과:
 1. rar
 1. rb
 */
 
?>

GLOB_MARK 상수

예제 (ex #3
 <?php
 
// r로 시작하는 파일, 폴더를 찾습니다. 폴더는 끝에 \가 붙습니다.
 
$j 1
;
 foreach(
glob("r*",GLOB_MARK) as $value
){
     echo 
"${j}. $value<br/>"
;
     
$j
++;
 }

 
/*
 결과:
 1. rar\
 2. rb\
 3. rdmininy\
 4. readme.html
 5. rss.gif
 */
 
?>

GLOB_BRACE 상수

예제 (ex #4
 <?php
 
// 확장자 .php, .html, .txt인 파일을 찾습니다.
 
$j 1
;
 foreach(
glob("{*.php,*.html,*.txt}",GLOB_BRACE) as $value
){
     echo 
"${j}. $value<br/>"
;
     
$j
++;
 }
 
?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag 검색

댓글을 달아 주세요

해당하는 폴더 전체 용량 구하는 소스입니다.

<?php
 
// 폴더 전체용량
 
function dirsize($dir
){
       static 
$size$cnt
;
       
$fp opendir($dir
);
       while(
false !== ($entry readdir($fp
))){
             if((
$entry != ".") && ($entry != ".."
)){
                  if(
is_dir($dir.'/'.$entry
)){
                       
clearstatcache
();
                       
dirsize($dir.'/'.$entry
);
                  } else if(
is_file($dir.'/'.$entry
)){
                       
$size += filesize($dir.'/'.$entry
);
                       
clearstatcache
();
                       
$cnt
++;
                  }
             }
       }
      
closedir($fp
);

      
$stat 
= array(
                
'size' => $size
,
                
'cnt' => 
$cnt
      
);
      return 
$stat
;
 } 
// end func

 
function attach($size
) {
      if(
$size 1024
){
            return 
number_format($size*1.024).'b'
;
      } else if((
$size 1024) && ($size 1024000
)){
            return 
number_format($size*0.001024).'Kb'
;
      } else if(
$size 1024000
){
            return 
number_format($size*0.000001024,2).'Mb'
;
      }
      return 
0
;
 }

 
// 사용법: $arr = dirsize(폴더 경로);
 // $arr['cnt'] <- 총 파일 수, $arr['size'] <- 총 용량 수
 
$stat dirsize('./includes'
);

 echo 
"총 파일수: ".$stat['cnt']." 총 파일 용량: ".attach($stat['size'
]);

 
?>


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

bool feof ( resource $handle ) (PHP 4, PHP 5)

파일 포인터를 읽어 들인 위치가 끝인지 아닌지를 알기 위해 우선 파일을 "오픈"하고, "테스트"하고, "닫기"순으로 작성하면 됩니다. 해당 파일의 포인터가 끝이면 true를, 아니면 false를 반환합니다.

예제 (ex #1

 <?php
 
if(filetype('test.php') === 'file'
){
      
$fp fopen("test.php""rb"); 
// 오픈하기 (r은 읽기전용, b는 바이러니로 오픈하기)
      
while(!feof($fp)) { 
// 포인터의 위치가 끝이 아니면 실행
         
print fread($fp1024); 
// 한줄씩 읽어 옵니다.
         
flush
();
      }
      
fclose ($fp); 
// 닫기
 
}
 
clearstatcache
();
 
?>


다음은 파일 다운로드 예제입니다.

예제 (ex #2

 <?php
 $filename 
'test.php'
;

 
header("Cache-control: private"
);
 
header("Content-type: ".user_mime_content_type($filename
));
 
header("Content-Disposition: attachment; filename=".$filename
);
 
header("Content-Length: ".filesize($filename
));
 
header("Cache-Control: cache, must-revalidate"
);
 
header("Content-Description: PHP3 Generated Data"
);
 
header("Pragma: no-cache"
);
 
header("Expires: 0"
);

 if(
filetype('test.php') === 'file'
){
      
$fp fopen("test.php""rb"); 
// 오픈하기
      
while(!feof($fp
)) { 
         print 
fread($fp1024); 
// 한줄씩 읽어 옵니다.
         
flush
();
      }
      
fclose ($fp); 
// 닫기
 
} else {
    
header_remove(); 
// 파일이 아니면 전송 헤더목록을 삭제합니다.
 
}
 
clearstatcache
();
 
?>


user_mime_content_type함수는 [phP 함수 레퍼런스/파일 함수] - mime_content_type 함수를 참조해 주세요.
블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag fopen

댓글을 달아 주세요

string filetype ( string $filename ) (PHP 4, PHP 5)

파일의 타입을 반환하는 함수로서 사용법은 다음과 같습니다.

예제 (ex #1

 <?php
 $fname 
'mail'
;
 
// file_exists함수는 파일(또는 디렉토리)가 존재하는지 체크하는 함수
 
if(file_exists($fname
)){
     
$type filetype($fname
);
 }
 echo 
$type
// 결과: dir

 
$fname 'test.php'
;
 if(
file_exists($fname
)){
     
$type filetype($fname
);
 }
 echo 
$type
// 결과: file
 
?>


파일의 타입, 즉 파일의 유형에 따라 다음 표의 값을 반환합니다.

  반환 값      의 미
 fifo  네임드 파이프
 char  캐릭터 디바이스
 dir  디렉토리
 block  블록 디바이스
 link  심벌릭 링크
 file  일반 파일
 unknown  알 수 없는 파일

예제 (ex #2

 <?php
 $type 
filetype('./mail'
);
 if(
$type === 'dir'
)  {
    echo 
"mail은 디렉토리입니다."
;
 }

 
$type filetype('./slink'
);
 if(
$type === 'link'
)  {
    echo 
"slink는 심볼릭 링크파일입니다."
;
 }
 
?>


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

int fileperms ( string $filename ) (PHP 4, PHP 5)

인자에 파일(또는 디렉토리)의 경로를 지정하면 10진수로 반환하는데, 일반적으로 파일의 권한이 0644이므로 10진수인 33188로 반환받아 8진수로 변환해줄 필요가 있습니다.

예제 (ex #1
 <?php
 $stat 
fileperms('test.php'
);
 echo 
$stat
// 결과: 33188

 // decoct함수는 10진수를 8진수로 변환해줍니다.
 
$decoct decoct($stat
);
 echo 
$decoct
// 결과: 100644

 // substr함수로 끝에서 4자리만 추출해서 8진수로 만들어 줍니다.
 
echo substr($decoct, -4); 
// 결과: 0644
 
?>

sprintf함수로도 가능합니다.

예제 (ex #2
 <?php
 
// %o는 정수를 8진수로 변환해줍니다.
 
$decoct substr(sprintf('%o'fileperms('test.php')), -4
);

 echo 
$decoct
// 결과: 0644
 
?>

substr로 끝에서 4자리를 자르는 즉은 파일의 유형에 따라 4~6자리로 표현되기 때문입니다.

다음은 다른 방법의 예제입니다.

예제 (ex #3
 <?php
 $dir 
'./mail/test.php'
;
 if(
is_file($dir
)){
    
// 파일이면 -32768, 폴더이면 -16384를 뺀 나머지가 권한입니다.
    
$perms fileperms($dir) - 32768
;
    echo 
$perms
// 결과: 644
 
} else if(is_dir($dir
)){
    
$perms fileperms($dir) - 16384
;
    echo 
$perms
;
 }
 
?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag 퍼미션

댓글을 달아 주세요

디렉토리인지 체크하는 is_dir 함수


bool
is_dir ( string $filename )
(PHP 4, PHP 5)

디렉토리이면 true를 반환하고, 아니면 false를 반환합니다.

예제 (ex #1

 <?php
 var_dump
(is_dir('file.txt')); 
// 결과: false

 
var_dump(is_dir('mydirs')); 
// 결과: true

 
var_dump(is_dir('..')); 
// 결과: true
 
?>


파일인지 체크하는 is_file 함수


bool is_file ( string $filename )
(PHP 4, PHP 5)

파일이면 true를 반환하고, 아니면 false를 반환합니다.

예제 (ex #2

 <?php
 var_dump
(is_file('file.txt')); 
// 결과: true

 
var_dump(is_file('mydirs')); 
// 결과: false

 
var_dump(is_file('..')); 
// 결과: false
 
?>


읽기 가능한 파일(또는 폴더)인지 체크하는 is_readable 함수


bool is_readable ( string $filename )
(PHP 4, PHP 5)

읽기 가능한 파일(또는 폴더)이면 true를 반환하고, 아니면 false를 반환합니다.

예제 (ex #3

 <?php
 
if (is_readable('test.txt'
)) {
    echo 
'읽기 가능한 파일입니다.'
;
 }else{
    echo 
'읽기 권한이 없는 파일입니다. 권한 0707, 0777로 바꿔주세요.'
;
 }
 
?>


쓰기 가능한 파일(또는 폴더)인지 체크하는 is_writable 함수


bool is_writable ( string $filename )
(PHP 4, PHP 5)

쓰기 가능한 파일(또는 폴더)이면 true를 반환하고, 아니면 false를 반환합니다.

예제 (ex #4

 <?php
 
if (is_writable('test.txt'
)) {
    echo 
'쓰기 가능한 파일입니다.'
;
 }else{
    echo 
'쓰기 권한이 없는 파일입니다. 권한 0707, 0777로 바꿔주세요.'
;
 }
 
?>


실행 가능한 파일인지 체크하는 is_executable 함수


bool is_executable ( string $filename )
(PHP 4, PHP 5)

실행 가능한 파일이면 true를 반환하고, 아니면 false를 반환합니다.

예제 (ex #5

 <?php
 
if (is_executable('test.txt'
)) {
    echo 
'실행 가능한 파일입니다.'
;
 }else{
    echo 
'실행 권한이 없는 파일입니다. 권한 0707, 0777로 바꿔주세요.'
;
 }
 
?>


읽기, 쓰기, 실행의 권한 문제에 대한 설명은 퍼미션(Permission) 설정을 참고하십시요.
블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag 퍼미션

댓글을 달아 주세요

void clearstatcache ([ bool $clear_realpath_cache= false [, string $filename ]] )
(PHP 4, PHP 5)

아래 표의 함수를 실행하면 같은 파일 이름을 사용할 경우를 위해 캐시로 임시 저장하여 메모리의 일정 부분 자원으로 할당하게 합니다. 이 일은 꽤많은 자원을 소모하는 일이기도 합니다. 시스템 자원 소모를 줄이기 위해 메모리에서 강제적으로 삭제하여 자원을 확보하거나 새로운 변경값으로 적용해 주는 기능이 clearstatcache 함수입니다.

     목 록
 stat
 lstat
 file_exists
 is_writable
 is_readable
 is_executable
 is_file
 is_dir
 is_link
 filectime
 fileatime
 filemtime
 fileinode
 filegroup
 fileowner
 filesize
 filetype
 fileperms

아래는 clearstatcache 함수를 호출하지 않았을 때의 결과입니다.

예제 (ex #1

 <?php
 $size1 
filesize('test.txt'
);

 echo 
"${size1}<br/>"
// 결과: 399

 
$fp fopen('test.txt','a'
);
 
fputs($fp,'clearstatcache 함수 테스트입니다.'
);
 
fclose($fp
);

 
$size2 filesize('test.txt'
);

 echo 
"${size2}<br/>"
// 결과: 399

 
$fp fopen('test.txt','a'
);
 
fputs($fp,'clearstatcache 함수 테스트입니다.'
);
 
fclose($fp
);

 
$size3 filesize('test.txt'
);

 echo 
"${size3}<br/>"
// 결과: 399
 
?>


test.txt 파일에 새로운 내용을 작성하면 파일의 사이즈가 커져야 하지만 결과는 그렇지 않습니다. 이는 최초에 캐시에 저장되어 있는 값을 그대로 가져오기 때문입니다. 그래서 clearstatcache 함수를 호출해서 캐시를 삭제하게 해줘야 원하는 값을 얻을 수 있습니다.

예제 (ex #2

 <?php
 $size1 
filesize('test.txt'
);
 
clearstatcache(); 
//  clearstatcache 함수로 캐시를 삭제합니다.

 
echo "${size1}<br/>"
// 결과: 399

 
$fp fopen('test.txt','a'
);
 
fputs($fp,'clearstatcache 함수 테스트입니다.'
);
 
fclose($fp
);

 
$size2 filesize('test.txt'
);
 
clearstatcache(); 
//  clearstatcache 함수로 캐시를 삭제합니다.

 
echo "${size2}<br/>"
// 결과: 405

 
$fp fopen('test.txt','a'
);
 
fputs($fp,'clearstatcache 함수 테스트입니다.'
);
 
fclose($fp
);

 
$size3 filesize('test.txt'
);
 
clearstatcache(); 
//  clearstatcache 함수로 캐시를 삭제합니다.

 
echo "${size3}<br/>"
// 결과: 411
 
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag fopen

댓글을 달아 주세요

해당하는 디렉토리를 삭제해야할 경우 rmdir함수를 사용합니다.

bool rmdir ( string $dirname [, resource $context ] )  (PHP 4, PHP 5)

삭제에 성공하면 true를. 실패하면 php 오류코드를 표시합니다. rmdir함수앞에 @를 삽입하여 오류코드가 표시되지 않도록 해야 하며, 하위폴더나 이하 파일 권한(퍼미션)이 0707이나 0777이 아니면 삭제에 실패하게 됩니다. 단, 윈도우의 경우 권한설정이 없으므로 생략됩니다.

예제 (ex #1
 <?php
 $dir 
'mydir'
// 삭제 대상 폴더
 
if(rmdir($dir
)) {
    echo 
"삭제에 성공하였습니다."
;
 } else {
    echo 
"삭제에 실패하였습니다."
;
 }
 
?>

디렉토리 삭제 실패 이유는 권한문제뿐 아니라 폴더가 없거나 아니거나 삭제대상 폴더 내의 파일이나 폴더가 존재하면 삭제할 수 없습니다. 그러므로 재귀호출을 이용하여 하위 폴더를 일괄 삭제하게 합니다.

예제 (ex #2

 <?php
 
function rmdir_ok($dir
) {
     
$dirs dir($dir
);
     while(
false !== ($entry $dirs->read
())) {
         if((
$entry != '.') && ($entry != '..'
)) {
             if(
is_dir($dir.'/'.$entry
)) {
                   
rmdir_ok($dir.'/'.$entry
);
             } else {
                   @
unlink($dir.'/'.$entry
);
             }
         }
     }
     
$dirs->close
();
     @
rmdir($dir
);
 }

 
rmdir_ok('삭제할 경로'
);

 
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

해당하는 경로안에 디렉토리를 생성해야할 경우 mkdir 함수를 사용합니다. 이 함수는 해당 경로 안에 생성할 경로명과 권한설정을 담당하며, 생성은 윈도우나 유닉스계열에 정상 동작하지만 권한설정만은 윈도우에서는 동작하지 않습니다.

bool mkdir ( string $pathname [, int $mode= 0777] )

 pathname = 생성할 경로명
 mode = 퍼미션(권한설정), 생략하면 기본값 0755로 자동 지정되며, 윈도우에서는 동작하지 않습니다.

디렉토리 생성 성공시 true를 반환하고, 실패하면 php 오류 표시를 합니다. 그러므로 mkdir함수 앞에 @를 붙여서 오류 코드가 표시되지 않도록 하여 보안 유효성을 높여 줘야 합니다.

예제 (ex #1
 <?php
 $mydir 
"dir"
;
 if(@
mkdir($mydir0777
)) {
    if(
is_dir($mydir
)) {
        @
chmod($mydir0777
);
        echo 
"${mydir} 디렉토리를 생성하였습니다."
;
    }
 }
 else {
    echo 
"${mydir} 디렉토리를 생성하지 못했습니다."
;
 }
 
?>

디렉토리 생성실패의 이유는 몇 가지가 있습니다.

존재하지 않는 경로이거나 상위폴더의 권한이 0707, 0777이 아니거나 디렉토리가 이미 생성되어 있으면 php 오류코드를 표시하게 됩니다. 권한 문제의 경우 Owner(오너)와 Public(유저)에게 쓰기권한이 없을 때 오류가 나타납니다. 쓰기권한이 있어야 생성하니까요.

  Owner(소유자) Group(그룹) Public(유저)
 Read(읽기) 400 (R) 40 (R) 4 (R)
 Write(쓰기) 200 (W) 20 (W) 2 (W)
 Execute(실행) 100 (X) 10 (X) 1 (X)
 Permission(권한) 700 (RWX) 70 (RWX) 7 (RWX)

권한작성시 주의점은 8진수로 작성해야 한다는 것입니다. 777로 권한을 처리하고자 한다면 앞자리에 0을 추가해주어 0777로 하면 자동으로 8진수로 처리하게 됩니다. 그리고 작은 따옴표('')나 큰 따옴표("")로 감싸 주어서도 안됩니다. 반드시 8진수로 작성하여야 합니다.

예제 (ex #2
 <?php
 $mydir 
"dir"
;

 @
mkdir($mydir,"0777"); 
// 잘못된 표현

 
@mkdir($mydir0777); 
// 올바른 표현

 
?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

디렉토리 정보, 즉 엔트리(Entry)를 얻고자 할때의 방법은 몇 가지있습니다. dir클레스를 이용하거나 readdir, scandir을 이용하는 것입니다.

dir 클레스를 이용한 entry 얻기

해당 디렉토리의 엔트리를 가져오기 위해서는 폴더를 먼저 "오픈"하고, "읽기", "닫기" 순으로 작성하면 됩니다.

 <?php
 $path 
"./mail"
// 오픈하고자 하는 폴더
 
$entrys = array(); 
// 폴더내 Entry를 저장하기 위한 배열
 
$dirs dir($path); 
// 오픈하기
 
while(false !== ($entry $dirs->read())){ 
// 읽기
    
$entrys[] = $entry
;
 }
 
$dirs->close(); 
// 닫기

 
var_export($entrys
);

 
/*
 결과:
 array (
  0 => '.',
  1 => '..',
  2 => 'Mail',
  3 => 'Mail.php',
  4 => 'package.xml',
  5 => 'PEAR.php',
  6 => 'tests',
 )
 */
 
?>


"."와 ".."는 기본적으로 entry 로 가져오게 됩니다. 이를 제외시켜줄 필요가 있으며, 폴더와 파일을 구분지어 정리해 줄 필요가 있겠지요. 다음과 같이 처리해 주면 됩니다.

 <?php
 $path 
"./mail"
// 오픈하고자 하는 폴더
 
$entrys = array(); 
// 폴더내의 정보를 저장하기 위한 배열
 
$dirs dir($path); 
// 오픈하기
 
while(false !== ($entry $dirs->read())){ 
// 읽기
    
if(($entry != '.') && ($entry != '..'
)) {
        if(
is_dir($path.'/'.$entry)) { 
// 폴더이면
             
$entrys['dir'][] = $entry
;
        }
        else { 
// 파일이면
             
$entrys['file'][] = $entry
;
       }
    }
 }
 
$dirs->close(); 
// 닫기

 
$dircnt count($entrys['dir']); 
// 폴더 수
 
$filecnt count($entrys['file']); 
// 파일 수

 
echo "폴더 수: ${dircnt} 파일 수:${filecnt}<br/>\n"
;
 
var_export($entrys
);

 
/*
 결과:
 폴더 수: 2 파일 수:3<br/>
 array (
  'dir' => 
  array (
    0 => 'Mail',
    1 => 'tests',
  ),
  'file' => 
  array (
    0 => 'Mail.php',
    1 => 'package.xml',
    2 => 'PEAR.php',
  ),
 )
 */
 
?>


readdir를 이용한 entry 얻기

readdir함수로 엔트리를 얻을 수 있지만 opendir 함수와 closedir 함수가 필요합니다. 순서는 같습니다. opendir 로 오픈하고, readdir 로 읽고, closedir 로 닫아 주면 됩니다.

 <?php
 $path 
"./mail"
// 오픈하고자 하는 폴더
 
$entrys = array(); 
// 폴더내의 정보를 저장하기 위한 배열
 
$dirs opendir($path); 
// 오픈하기
 
while(false !== ($entry readdir($dirs))){ 
// 읽기
    
$entrys[] = $entry
;
 }
 
closedir($dirs); 
// 닫기

 
var_export($entrys
);

 
/*
 결과:
 array (
  0 => '.',
  1 => '..',
  2 => 'Mail',
  3 => 'Mail.php',
  4 => 'package.xml',
  5 => 'PEAR.php',
  6 => 'tests',
 )
 */
 
?>


scandir를 이용한 entry 얻기

scandir함수는 (PHP 5)이상부터 지원을 합니다. 이하 버전에서는 오픈하고 읽고, 닫기 순으로 처리해 주어야 가능하지만, (PHP 5)부터 scandir 함수 하나로 모든 처리가 가능해 졌습니다.

array scandir ( string $directory [, int $sorting_order [, resource $context ]] )

$directory 은 탐색할 디렉토리, $sorting_order 은 정렬 순서입니다. $sorting_order 에 1을 대입하면 역순으로 데이터를 정렬합니다.

 <?php
 $dir    
'/tmp'
;
 
$files1 scandir($dir); 
// 오름차순으로 엔트리 얻기
 
$files2 scandir($dir1); 
// 내림차순으로 엔트리 얻기

 
print_r($files1
);
 
print_r($files2
);

 
/*
 결과:
 Array
 (
    [0] => .
    [1] => ..
    [2] => bar.php
    [3] => foo.txt
    [4] => somedir
 )
 Array
 (
    [0] => somedir
    [1] => foo.txt
    [2] => bar.php
    [3] => ..
    [4] => .
 )
 */
 ?> 


readdir함수로도 가능합니다.

<?php
 $dir 
"/tmp"
;
 
$dh  opendir($dir
);
 while (
false !== ($filename readdir($dh
))) {
    
$files[] = $filename
;
 }

sort($files); 
// 오름차순으로 정렬

print_r($files
);

rsort($files); 
// 내림차순으로 정렬

print_r($files
);

 
/*
 결과:
 Array
 (
    [0] => .
    [1] => ..
    [2] => bar.php
    [3] => foo.txt
    [4] => somedir
 )
 Array
 (
    [0] => somedir
    [1] => foo.txt
    [2] => bar.php
    [3] => ..
    [4] => .
 )
 */
 ?>


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

chdir (PHP 4, PHP 5)

bool
chdir ( string $directory )

chdir함수성공할 경우 true를, 실패할 경우 false를 반환합니다.

예제 (ex #1

 <?php

 
// 현재 디렉토리
 
echo getcwd() . "\n"
// 출력: c:\server\public_html

 
chdir('mail'); 
// mail 디렉토리로 이동....

 // 현재 디렉토리
 
echo getcwd() . "\n"
// 출력: c:\server\public_html\mail

 
if(chdir('..')) { 
// 상위 디렉토리로 이동

 // 현재 디렉토리
 
echo getcwd() . "\n"
;

 
// 출력: c:\server\public_html
 
}
 ?> 

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

getcwd (PHP 4, PHP 5)

string getcwd ( void )

값이 존재하면 "현제 경로"를 얻고 그렇지 않으면 false를 반환합니다. 단, 폴더의 접근권한에 제한이 있다면 false를 반환하는 경우도 있음에 주의해야 합니다.

 <?php
 
print( getcwd 
() );
 
// 출력: C:\server\public_html
 
?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

mime_content_type (PHP 4 >= 4.3.0, PHP 5)

이 함수는 단순히 파일의 확장자를 기초로 파일타입을 출력합니다.
예로 myimage.bmp가 있다면 실제 그림타입이 jpg이지만 bmp타입을 출력할 것입니다.

string
mime_content_type ( string $filename )

 <?php
 
function user_mime_content_type($filename
)
 {
   if(!
function_exists('mime_content_type'
))
   {
      
$type 
= array(
      
'txt' => 'text/plain'
,
      
'htm' => 'text/html'
,
      
'html' => 'text/html'
,
      
'php' => 'text/html'
,
      
'css' => 'text/css'
,
      
'js' => 'application/javascript'
,
      
'json' => 'application/json'
,
      
'xml' => 'application/xml'
,
      
'swf' => 'application/x-shockwave-flash'
,
      
'flv' => 'video/x-flv'
,

      
// images
      
'png' => 'image/png'
,
      
'jpe' => 'image/jpeg'
,
      
'jpeg' => 'image/jpeg'
,
      
'jpg' => 'image/jpeg'
,
      
'gif' => 'image/gif'
,
      
'bmp' => 'image/bmp'
,
      
'ico' => 'image/vnd.microsoft.icon'
,
      
'tiff' => 'image/tiff'
,
      
'tif' => 'image/tiff'
,
      
'svg' => 'image/svg+xml'
,
      
'svgz' => 'image/svg+xml'
,
     
      
// archives
      
'zip' => 'application/zip'
,
      
'rar' => 'application/x-rar-compressed'
,
      
'exe' => 'application/x-msdownload'
,
      
'msi' => 'application/x-msdownload'
,
      
'cab' => 'application/vnd.ms-cab-compressed'
,
     
      
// audio/video
      
'mp3' => 'audio/mpeg'
,
      
'qt' => 'video/quicktime'
,
       
'mov' => 'video/quicktime'
,
    
      
// adobe
      
'pdf' => 'application/pdf'
,
      
'psd' => 'image/vnd.adobe.photoshop'
,
      
'ai' => 'application/postscript'
,
      
'eps' => 'application/postscript'
,
      
'ps' => 'application/postscript'
,

      
// ms office
      
'doc' => 'application/msword'
,
      
'rtf' => 'application/rtf'
,
      
'xls' => 'application/vnd.ms-excel'
,
      
'ppt' => 'application/vnd.ms-powerpoint'
,
    
      
// open office
      
'odt'=>'application/vnd.oasis.opendocument.text'
,
      
'ods'=>'application/vnd.oasis.opendocument.spreadsheet'
,
     );
     
$ext strtolower(array_pop(explode('.',$filename
)));
     if (
array_key_exists($ext$type
))
     {
         return 
$type[$ext
];
      }
      elseif (
function_exists('finfo_open'
))
     {
         
$finfo finfo_open(FILEINFO_MIME
);
         
$mimetype finfo_file($finfo$filename
);
         
finfo_close($finfo
);
         return 
$mimetype
;
     }
     else
    {
        return 
'application/octet-stream'
;
    }
  }
  else
  {
      return 
mime_content_type($filename
);
   }
 }

 ?>


예제 (ex #1
 <?php
  $type 
user_mime_content_type("test.bmp.txt.zip.jpg"
);
 
print_r($type); 
// 결과: image/jpeg
 ?>

예제 (ex #2
 <?php
 $type 
user_mime_content_type("test.jpg"
);
 
header("Content-type: ".$type
);
 
header("content-disposition: attachment; filename=\"test.jpg\""
);
 
header("content-description: php generated data"
);
 
header("Pragma: no-cache"
); 
 
header("Expires: 0"
); 

 
$fp fopen("test.jpg""r"
);
 if (!
fpassthru($fp
))
 {
   
fclose($fp
);
 }
 @
flush
();
 ?>
블로그 이미지

하보니

하보니와 함께하는 phP 초보

Tag MIME

댓글을 달아 주세요