I just learned that, to specify file names in a portable manner, you DON'T need 'DIRECTORY_SEPARATOR' - just use '/'. This really surprised and shocked me, as until now I typed about a zillion times 'DIRECTORY_SEPARATOR' to stay platform independent - unnecessary. Don't make the same mistake.
파일시스템 함수
소개
요구 조건
이 확장을 빌드하기 위해서 외부 라이브러리가 필요하지 않습니다. 그러나 리눅스에서 PHP가 LFS(large files)를 지원하려면, 최근의 glibc를 사용하고, PHP에 다음 플래그를 지정하여 컴파일해야 합니다: -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
설치
이 함수들은 설치하지 않아도 사용할 수 있습니다; PHP 코어의 일부입니다.
실행시 설정
이 함수의 작동은 php.ini 설정에 영향을 받습니다.
| 이름 | 기본값 | 변경권한 |
|---|---|---|
| allow_url_fopen | "1" | PHP_INI_SYSTEM |
| user_agent | NULL | PHP_INI_ALL |
| default_socket_timeout | "60" | PHP_INI_ALL |
| from | NULL | ?? |
| auto_detect_line_endings | "Off" | PHP_INI_ALL |
위 설정 지시어에 대한 간단한 설명입니다.
- allow_url_fopen boolean
-
이 옵션은 URL 객체에 파일처럼 접근할 수 있는 URL-판단 fopen 랩퍼를 활성화합니다. 기본 랩퍼는 ftp나 http 프로토콜을 사용하여 원격 파일의 접근을 제공하며, zlib 등의 몇몇 확장은 추가 랩퍼를 등록합니다.
Note: 보안을 위해, 이 옵션은 php.ini에서만 설정할 수 있습니다.
Note: 이 옵션은 버전 4.0.3 릴리즈 후에 추가되었습니다. 버전 4.0.3과 이전 버전에서 이 기능을 무효화 하려면 설정 스위치 --disable-url-fopen-wrapper 를 사용하여 컴파일해야만 했습니다.
Warning윈도우즈 버전 PHP 4.3.0 이전에는, 다음 함수는 원격 파일 접근을 허용하지 않습니다: include(), include_once(), require(), require_once(), 그리고 Image 확장의 imagecreatefromXXX 함수.
- user_agent string
-
PHP가 전송하는 유저 에이전트를 지정합니다.
- default_socket_timeout integer
-
소켓 기반 스트림의 기본 시간 제한(초단위).
Note: 이 설정 옵션은 PHP 4.3.0에서 추가되었습니다.
- from="joe@example.com" string
-
익명 ftp 패스워드(email 주소)를 지정합니다.
- auto_detect_line_endings boolean
-
on일 때, PHP는 fgets()과 file()으로 읽혀지는 데이터가 줄바꿈 방식으로 유닉스, MS-DOS, 매킨토시 방식 중 어느걸 사용하는지 검사합니다.
이는 PHP가 매킨토시 시스템과 작업을 할 수 있게 하지만, 첫째 줄에서 EOL 방식을 검출하기 위해서 아주 작은 성능에 페널티가 존재하고, 유닉스 시스템에서 사람들이 아이템 구분자로 캐리지-리턴을 사용해왔었기에, 하위 호환성이 사라질 수 있는 이유로 인해, 기본값은 Off입니다.
Note: 이 설정 옵션은 PHP 4.3.0에서 추가되었습니다.
자원형
예약 상수
이 확장은 다음의 상수들을 정의합니다. 이 확장을 PHP에 내장했거나, 실행시에 동적으로 읽어들일 경우에만 사용할 수 있습니다.
- GLOB_BRACE (integer)
- GLOB_ONLYDIR (integer)
- GLOB_MARK (integer)
- GLOB_NOSORT (integer)
- GLOB_NOCHECK (integer)
- GLOB_NOESCAPE (integer)
- PATHINFO_DIRNAME (integer)
- PATHINFO_BASENAME (integer)
- PATHINFO_EXTENSION (integer)
- FILE_USE_INCLUDE_PATH (integer)
- FILE_APPEND (integer)
- FILE_IGNORE_NEW_LINES (integer)
- FILE_SKIP_EMPTY_LINES (integer)
Table of Contents
- basename — 경로명에서 파일이름만 반환합니다
- chgrp — 파일의 그룹을 변환합니다
- chmod — 파일의 모드 변경
- chown — 파일의 소유자 변경
- clearstatcache — 파일의 통계(stat) 캐시를 삭제합니다.
- copy — 파일을 복사합니다
- delete — 실제로는 없는 명령
- dirname — 경로의 구성요소중에서 디렉토리 이름만 반환합니다.
- disk_free_space — Returns available space in directory
- disk_total_space — Returns the total size of a directory
- diskfreespace — 디렉토리의 사용가능한 공간을 반환합니다.
- fclose — 열려있는 파일 포인터를 닫습니다.
- feof — 파일의 끝이 파일포인터에 있는지 테스트합니다.
- fflush — 출력결과를 파일로 보냅니다.
- fgetc — 파일포인터로부터 문자 가져오기
- fgetcsv — 파일포인터에서 라인을 가져오고 CVS 에 맞게 변환합니다.
- fgets — 파일 포인터에서 라인 가져오기
- fgetss — 파일포인터에서 라인을 가져오고 HTML 태그를 없애기
- file_exists — 파일이 있는지 체크
- file_get_contents — Reads entire file into a string
- file_put_contents — Write a string to a file
- file — 파일전체를 배열로 읽어들임
- fileatime — 최근에 파일에 접근한 시간을 가져옴
- filectime — 파일의 아이노드 변경시간을 가져옵니다
- filegroup — 파일의 그룹을 가져옵니다
- fileinode — 파일의 아이노드를 가져옵니다
- filemtime — 파일이 수정된 시간을 가져옵니다
- fileowner — 파일의 소유자를 가져옵니다
- fileperms — 파일의 권한을 가져옵니다
- filesize — 파일의 크기를 가져옵니다
- filetype — 파일의 형식을 가져옵니다
- flock — 파일 잠김에 관한 간단한 도움말
- fnmatch — Match filename against a pattern
- fopen — 파일이나 URL을 엽니다
- fpassthru — 파일 포인터에 남아있는 모든 데이타를 출력합니다
- fputcsv — Format line as CSV and write to file pointer
- fputs — 파일 포인터에 기록하기
- fread — Binary-safe 파일 읽기
- fscanf — 형식에 따라서 파일로 부터 분석하여 입력하기
- fseek — 파일 포인터에서 찾기
- fstat — 오픈 파일 포인터를 사용하는 파일에 대한 정보 가져오기
- ftell — 파일포인터의 읽기/쓰기 위치 말하기
- ftruncate — 주어진 길이로 잘라내기
- fwrite — Binary-safe 파일 쓰기
- glob — Find pathnames matching a pattern
- is_dir — filename 이 디렉토리인지 아닌지 이야기하기
- is_executable — filename이 실행가능한 것인지 아닌지 이야기하기
- is_file — filename이 보통 파일인지 아닌지 이야기하기
- is_link — filename이 심볼릭 링크인지 아닌지 이야기하기
- is_readable — filename이 읽기 가능한 것인지 아닌지 이야기하기
- is_uploaded_file — file이 HTTP POST를 통해 업로드된 것인지 아닌지 이야기하기
- is_writable — filename이 쓰기가능한 것인지 아닌지 이야기하기
- is_writeable — Alias of is_writable
- lchgrp — Changes group ownership of symlink
- lchown — Changes user ownership of symlink
- link — hard link 만들기
- linkinfo — 링크 정보 가져오기
- lstat — 파일이나 심볼릭 링크에 관한 정보를 제공
- mkdir — 디렉토리 만들기
- move_uploaded_file — 업로드된 파일을 다른곳으로 이동하기
- parse_ini_file — Parse a configuration file
- pathinfo — Returns information about a file path
- pclose — 진행되는 파일 포인터 닫기
- popen — 진행되는 파일 포인터를 열기
- readfile — 파일을 출력합니다
- readlink — symbolic link의 target 반환
- realpath — 표준화된 절대 경로명을 반환합니다
- rename — 파일을 새 이름으로 고치기
- rewind — 파일포인터의 위치를 되돌립니다(rewind).
- rmdir — 디렉토리 제거하기
- set_file_buffer — 주어진 파일 포인터에 파일 버퍼링 설정하기
- stat — file에 대한 정보 제공
- symlink — 심볼릭 링크 만들기
- tempnam — 유일한 파일 이름 만들기
- tmpfile — 임시 파일 만들기
- touch — 파일의 수정시간을 설정합니다
- umask — 현재의 umask를 변경하기
- unlink — 파일을 삭제하기
파일시스템
17-Mar-2007 10:24
25-Feb-2005 08:27
I made this function to search and/or display files by extension or for a string occurance in the filename. Any comments or enhancements are welcome offcourse. I'll update this function soon.
usage: list_files([string], [string], [int 1 | 0], [int 1 | 0]);
search for extension: list_files([string], [string], [0], [int 1 | 0]);
returns array: $myArray = list_files([string], [string], [0], [0]);
echo result: list_files([string], [string], [0], [1]);
search for string occurance: list_files([string], [string], [1], [int 1 | 0]);
returns array: $myArray = list_files([string], [string], [1], [0]);
echo result: list_files([string], [string], [1], [1]);
<?php
function list_files($directory, $stringSearch, $searchHandler, $outputHandler) {
$errorHandler = false;
$result = array();
if (! $directoryHandler = @opendir ($directory)) {
echo ("<pre>\nerror: directory \"$directory\" doesn't exist!\n</pre>\n");
return $errorHandler = true;
}
if ($searchHandler === 0) {
while (false !== ($fileName = @readdir ($directoryHandler))) {
if(@substr ($fileName, - @strlen ($stringSearch)) === $stringSearch) {
@array_push ($result, $fileName);
}
}
}
if ($searchHandler === 1) {
while(false !== ($fileName = @readdir ($directoryHandler))) {
if(@substr_count ($fileName, $stringSearch) > 0) {
@array_push ($result, $fileName);
}
}
}
if (($errorHandler === true) && (@count ($result) === 0)) {
echo ("<pre>\nerror: no filetype \"$fileExtension\" found!\n</pre>\n");
}
else {
sort ($result);
if ($outputHandler === 0) {
return $result;
}
if ($outputHandler === 1) {
echo ("<pre>\n");
print_r ($result);
echo ("</pre>\n");
}
}
}
?>
30-Dec-2003 04:39
Here is a function I wrote to get the relative path between 2 files or directory.
We suppose that paths are wrotten in Unix format (/ instead of windows \\)
<?php
/**
* Return the relative path between two paths / Retourne le chemin relatif entre 2 chemins
*
* If $path2 is empty, get the current directory (getcwd).
* @return string
*/
function relativePath($path1, $path2='')
{
if ($path2 == '') {
$path2 = $path1;
$path1 = getcwd();
}
//Remove starting, ending, and double / in paths
$path1 = trim($path1,'/');
$path2 = trim($path2,'/');
while (substr_count($path1, '//')) $path1 = str_replace('//', '/', $path1);
while (substr_count($path2, '//')) $path2 = str_replace('//', '/', $path2);
//create arrays
$arr1 = explode('/', $path1);
if ($arr1 == array('')) $arr1 = array();
$arr2 = explode('/', $path2);
if ($arr2 == array('')) $arr2 = array();
$size1 = count($arr1);
$size2 = count($arr2);
//now the hard part :-p
$path='';
for($i=0; $i<min($size1,$size2); $i++)
{
if ($arr1[$i] == $arr2[$i]) continue;
else $path = '../'.$path.$arr2[$i].'/';
}
if ($size1 > $size2)
for ($i = $size2; $i < $size1; $i++)
$path = '../'.$path;
else if ($size2 > $size1)
for ($i = $size1; $i < $size2; $i++)
$path .= $arr2[$i].'/';
return $path;
}
?>
Enjoy ! :-)
22-Aug-2003 05:23
This function searches a directory and returns an array of all files whose filename matches the specified regular expression. It's similar in concept to the Unix find program.
function findfile($location='',$fileregex='') {
if (!$location or !is_dir($location) or !$fileregex) {
return false;
}
$matchedfiles = array();
$all = opendir($location);
while ($file = readdir($all)) {
if (is_dir($location.'/'.$file) and $file <> ".." and $file <> ".") {
$subdir_matches = findfile($location.'/'.$file,$fileregex);
$matchedfiles = array_merge($matchedfiles,$subdir_matches);
unset($file);
}
elseif (!is_dir($location.'/'.$file)) {
if (preg_match($fileregex,$file)) {
array_push($matchedfiles,$location.'/'.$file);
}
}
}
closedir($all);
unset($all);
return $matchedfiles;
}
$htmlfiles = findfile('/some/dir','/\.(htm|html)$/');
16-Jul-2003 10:25
I needed a function to find disk usage for a directory and its subs, so here it is. It's kinda like the Unix du program, except it returns the usage in bytes, not blocks.
function du($location) {
if (!$location or !is_dir($location)) {
return 0;
}
$total = 0;
$all = opendir($location);
while ($file = readdir($all)) {
if (is_dir($location.'/'.$file) and $file <> ".." and $file <> ".") {
$total += du($location.'/'.$file);
unset($file);
}
elseif (!is_dir($location.'/'.$file)) {
$stats = stat($location.'/'.$file);
$total += $stats['size'];
unset($file);
}
}
closedir($all);
unset($all);
return $total;
}
print du('/some/directory');
03-Jul-2003 10:25
In the code samples of the user-contributed notes, you'll find functions that sometimes need a slash at the end of a folder path and sometimes don't.
Here's a little function to append a slash at the end of a path if there isn't one already.
function append_slash_if_none($string)
{
if (ereg ("/$", $string))
{
return $string;
}
else
{
return ereg_replace("$", "/", $string);
}
}
(Replace with a backslash if you're on Windows...)
15-May-2003 10:10
Pollard@php.net contributed this in response to a question on setting these variables ...
This option *IS* settable within your PHP scripts.
Example:
<?php
ini_set('auto_detect_line_endings', true);
$contents = file('unknowntype.txt');
ini_set('auto_detect_line_endings', false);
$content2 = file('unixfile.txt');
?>
Note, with PHP 4.3 anytime Mac files are read using fgets or file you'll need to auto_detect_line_endings since \n is otherwise assumed. However, with PHP 5.0, stream_get_line() will allow you to specify what line ending character to read up to.
\\ Read a line from a MAC file
stream_get_line($fp, 4096, "\r");
\\ Read a line from a UNIX file
stream_get_line($fp, 4096, "\n");
\\ Read a line from a DOS file
stream_get_line($fp, 4096, "\r\n");
\\ Read a line up to any filesystem line ending
ini_set('auto_detect_line_endings', true); fgets($fp);
\\ You can also make up your own line ending characters:
\\ Read up to the first instance of ":"
stream_get_line($fp, 4096, ":");
03-Apr-2003 07:49
Here is a useful function if you're having trouble writing raw bytes into a file.
It receives an integer and returns an array containing the ASCII values of the bytes on each index of the array.
function int2bytes($number){
$byte = $number;
$i=0;
do{
$dec_tmp = $byte;
$byte = bcdiv($byte,256,0);
$resto = $dec_tmp - (256 * $byte);
$return[] = $resto;
} while($byte >= 256);
if($byte) $return[] = $byte;
return array_reverse($return);
}
Example:
$arr = int2bytes(75832);
$arr will contain the following values:
Array
(
[0] => 1
[1] => 40
[2] => 56
)
Now, to write this data to the file, just use a fputs() with chr(), just like this:
fputs($fp,chr($arr[0]).chr($arr[1]).chr($arr[2]))
-- Regis
08-Mar-2003 07:18
This is a function I use to determine if a file contains Binary information. I use this for my search engine so that it doesn't try to index files like .zip or .mp3 or any other file that doesn't contain readable information. It makes use of the Character Type Extension if it's loaded, if it's not then it uses Regular Expressions.
function is_binary($link)
{
$tmpStr = '';
@$fp = fopen($link, 'rb');
@$tmpStr = fread($fp, 256);
@fclose($fp);
if($tmpStr != '')
{
$tmpStr = str_replace(chr(10), '', $tmpStr);
$tmpStr = str_replace(chr(13), '', $tmpStr);
$tmpInt = 0;
for($i =0; $i < strlen($tmpStr); $i++)
{
if( extension_loaded('ctype') )
{
if( !ctype_print($tmpStr[$i]) )
$tmpInt++;
}
else
{
if( !eregi("[[:print:]]+", $tmpStr[$i]) )
$tmpInt++;
}
}
if($tmpInt > 5)
return(0);
else
return(1);
}
else
return(0);
}
