天天看點

PHP開發-檔案系統

文章目錄

    • 概述
    • 檔案資訊相關函數
      • file_exists();
      • filemtime();
      • filesize();
      • basename();
      • realpath();
    • 檔案指針
      • fseek();
      • ftell();
    • 檔案鎖
      • flock();
    • 讀寫檔案相關函數
      • fopen();
      • fwrite();
      • file_put_contents()
      • fgetc();
      • fgets();
      • fread();
      • file();
      • readfile();
      • fclose();
    • 其它檔案操作相關函數
      • copy();
      • unlink();
      • is_file();
      • rename();
    • 建立打開删除目錄操作函數
      • mkdir();
      • opendir();
      • closedir();
      • rmdir();
    • 讀取目錄内容
      • readdir();
      • scandir();
      • is_dir();
    • 周遊檔案夾内容的方式
    • 源碼

概述

php檔案系統指通過一些php函數完成 增删改,讀取資料的一些列操作

檔案資訊相關函數

檔案路徑最好用單引号 或 反斜線\,雙引号可能會有轉義等問題

file_exists();

判斷檔案是否否存在,傳回布爾值

$file = 'C:\Users\win_wp\Desktop\tmp\1.txt';
var_dump(file_exists($file));
           

filemtime();

擷取檔案修改時間,傳回時間戳

$file = 'C:\Users\win_wp\Desktop\tmp\1.txt';
$time = filemtime($file);
echo date('Y,m,d',$time)."<br/>";
           

filesize();

擷取檔案大小,機關位元組

對 2GB 以上的檔案,一些檔案系統函數可能傳回無法預期的結果 。

$file = 'C:\Users\win_wp\Desktop\tmp\1.txt';
echo filesize($file)."<br/>";
           

basename();

傳回路徑中的檔案名部分

$file = 'C:\Users\win_wp\Desktop\tmp\1.txt';
echo basename($file)."<br/>";
           

realpath();

傳回規範化絕對路徑,斜線轉反斜線,相對路徑轉絕對路徑 傳回值 布爾

$filere = '../tmp/test.php';
echo realpath($filere)."<br/>";
           

檔案指針

fseek();

檔案指針操作

$file = 'C:\Users\win_wp\Desktop\tmp\1.txt';
fseek($fp,1);
           

ftell();

擷取目前指針位置

fseek($fp,1);
echo ftell($fp);
           

檔案鎖

flock();

PHP開發-檔案系統

鎖一個檔案,鎖定時間内無法通路與編輯

$filere = '../tmp/test.php';
$fp_filere = fopen($filere,'r');
flock($fp_filere,LOCK_EX);
sleep(20); 
           

讀寫檔案相關函數

fopen();

打開檔案,資源類型

用得較多的mod參數

慎用 w 與 w+

mode 說明
r 隻讀方式打開,将檔案指針指向檔案頭,沒有報錯
r+ 讀寫方式打開,将檔案指針指向檔案頭,沒有報錯
a 在檔案末尾以追加寫入方式打開,沒有則建立
a+ 在檔案末尾以追加讀寫方式打開,沒有則建立
w 寫入方式打開,清空檔案,沒有則建立
w+ 讀寫方式打開,清空檔案,沒有則建立

fwrite();

寫入檔案,接收一個資源類型和一個寫入的資料,傳回寫入資料大小的整數

$fp = fopen($file,'r+');
write($fp,$data)
           

file_put_contents()

寫入一個字元串

接收 字元串類型的路徑與 資料,不用打開檔案,直接寫,檔案存在會清空

fgetc();

接收一個資源類型,fopen

從檔案句柄中擷取一個字元,一次讀取一個,檔案指針會下移

echo fgetc($fp);
echo fgetc($fp);
echo fgetc($fp);
           

fgets();

跟 上面的 fgetc() 函數基本一樣,但是它可以指定讀取到多少個位元組

len -1

個 ,長度必須大于0,遇到換行符時結束,傳回值為 布爾

注意,如果代碼前面有用 fgetc() 偏移檔案指針,fgets 會從偏移指針開始長度讀取,如果不想,使用 fseek() 函數重置檔案指針

$file = 'C:\Users\win_wp\Desktop\tmp\1.txt';
$fp = fopen($file,'r');
echo fgetc($fp);
fseek($fp,0);
echo "<hr>";
echo fgets($fp,9);
           

fread();

跟 fgets() 函數基本一樣,但是不受 換行符影響

$file = 'C:\Users\win_wp\Desktop\tmp\1.txt';
$fp = fopen($file,'r');
fseek($fp,0);
echo fread($fp,1000);
           

file();

不需要打開檔案

将檔案每一行讀取為一個數組元素,為一個 索引數組

$file = 'C:\Users\win_wp\Desktop\tmp\1.txt';
print_r(file($file));
           

readfile();

讀取檔案并寫入到輸出緩沖

$file = 'C:\Users\win_wp\Desktop\tmp\1.txt';
readfile($file);
           

fclose();

關閉一個檔案,及其指針,接收資源類型,傳回布爾值

$fp = fopen($file,'r');
fclose($fp);
           

其它檔案操作相關函數

copy();

拷貝檔案,傳回布爾值

$file = 'C:\Users\win_wp\Desktop\tmp\1.txt';
$new_file_name = 'C:\Users\win_wp\Desktop\tmp\1.txt.back';
copy($file,$new_file_name);
           

unlink();

删除檔案,傳回布爾值

$delfile = 'C:\Users\win_wp\Desktop\tmp\1.txt.back';
unlink($delfile);
           

is_file();

判斷給定檔案名是否為一個正常的檔案

判斷檔案是否存在,或者區分檔案與檔案夾

$file = 'C:\Users\win_wp\Desktop\tmp\1.txt';
var_dump(is_file($file));
           

rename();

重命名一個檔案或目錄

接收兩個個 字元串類型 (源檔案),一個新名字

$new_file_name = 'C:\Users\win_wp\Desktop\tmp\1.txt.back';
$file = 'C:\Users\win_wp\Desktop\tmp\1.txt';
rename($file,$new_file_name);
           

建立打開删除目錄操作函數

檔案夾操作

檔案夾操作跟 linux 檔案操作類似

mkdir();

建立檔案夾

$folder = '../tmpfile';
@mkdir($folder,0755,true);
           

opendir();

打開一個檔案夾句柄,資源類型

$folder = '../tmpfile';
var_dump(opendir($folder));
           

closedir();

關閉一個檔案夾句柄

$handle = opendir($folder);
var_dump(closedir($handle));
           

rmdir();

删除目錄

$folder = '../tmpfile';
rmdir($folder);
           

讀取目錄内容

readdir();

從目錄句柄中讀取條目,傳回布爾值

列出目前目錄下的所有檔案,檔案夾

$folder = 'C:\Users\win_wp\Desktop\tmp';
$opdir = opendir($folder);
$list = readdir($opdir);
echo $list."<br/>";
           

不過

readdir()

因為指針指向每次隻讀取這個檔案夾第一個目錄或檔案,可以用循環輸出目錄下的所有檔案資訊

$folder = 'C:\Users\win_wp\Desktop\tmp';
$opdir = opendir($folder);
$list = readdir($opdir);
echo $list."<br/>";
while (true){
	if ($list != false){
		$list = readdir($opdir);
		echo $list."<br/>";
	}else{
		break;
	}
}
           

or

$folder = 'C:\Users\win_wp\Desktop\tmp';
$opdir = opendir($folder);
while ($list = readdir($opdir)){
	echo $list."<br/>";
}
           
PHP開發-檔案系統

scandir();

列出指定路徑中的檔案和目錄,傳回一個索引數組數組

它不需要打開檔案,直接讀取

$sclist = scandir($folder);
var_dump($sclist);
foreach ($sclist as $value){
	echo $value."<br/>";
}
           

is_dir();

判斷是否為目錄(檔案夾)

周遊檔案夾内容的方式

使用scandir函數在周遊數組value

$folder = 'C:\Users\win_wp\Desktop\tmp\\';
$sclist = scandir($folder);
var_dump($sclist);
foreach ($sclist as $value){
	echo $value."<br/>";
}
           

使用readdir逐個讀取周遊

$folder = 'C:\Users\win_wp\Desktop\tmp\\';
$opdir = opendir($folder);
$list = readdir($opdir);
echo $list."<br/>";
while ($list = readdir($opdir)){
	echo $list."<br/>";
}
           
table_folder($folder);
function table_folder($folder){
	$tmp_name = $folder;
	$folder = 'C:\Users\win_wp\Desktop\tmp\\';
	$sclist = scandir($folder);
	foreach ($sclist as $value) {
		$item = $tmp_name.$value;
		echo $item."<br/>";
	}
}
           

源碼

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>filesystem</title>
</head>
<body>

<?php
	/**
	 * User: win_wp
	 * data: 2021/05/29
	 * time: 下午 07:38
	 */


	$file = 'C:\Users\win_wp\Desktop\tmp\1.txt';
	$filere = '../tmp/test.php';
	var_dump(file_exists($file));
	$time = filemtime($file);
	echo date('Y,m,d',$time)."<br/>";
	echo filesize($file)."<br/>";
	echo basename($file)."<br/>";
	echo realpath($filere)."<br/>";
	$fp = fopen($file,'r');
	$data = "3210f重\n123";
	var_dump(fwrite($fp,$data));
	file_put_contents('C:\Users\win_wp\Desktop\tmp\1.txt',$data);
	echo fgetc($fp);
	echo fgetc($fp);
	echo fgetc($fp);
	fseek($fp,0);
	echo "<hr>";
	echo fgets($fp,9)."<br/>";
	fseek($fp,0);
	echo fread($fp,1000)."<br/>";
	print_r(file($file));
	echo "<br/>";
	readfile($file);
	echo "<br/>";
//	$new_file_name = 'C:\Users\win_wp\Desktop\tmp\1.txt.back';
//	copy($file,$new_file_name);
	$delfile = 'C:\Users\win_wp\Desktop\tmp\1.txt.back';
	@unlink($delfile);
	var_dump(is_file($file));
	fseek($fp,1);
	echo ftell($fp);
	fclose($fp);
	$fp_filere = fopen($filere,'r');
	flock($fp_filere,LOCK_EX);
	sleep(2);
	$folder = '../tmpfile';
	@mkdir($folder,0755,true);
	var_dump(opendir($folder));
	$handle = opendir($folder);
	var_dump(closedir($handle));
//	rename($file,$new_file_name);
	rmdir($folder);
	$folder = 'C:\Users\win_wp\Desktop\tmp';
	$opdir = opendir($folder);
	$list = readdir($opdir);
	echo $list."<br/>";
	while (true){
		if ($list != false){
			$list = readdir($opdir);
			echo $list."<br/>";
		}else{
			break;
		}
	}
	$folder = 'C:\Users\win_wp\Desktop\tmp\\';
	$opdir = opendir($folder);
	$list = readdir($opdir);
	echo $list."<br/>";
	while ($list = readdir($opdir)){
		echo $list."<br/>";
	}
	echo "<br/>";

	$sclist = scandir($folder);
	var_dump($sclist);
	foreach ($sclist as $value){
		echo $value."<br/>";
	}

	echo "<hr/>";

	table_folder($folder);

	function table_folder($folder){
		$tmp_name = $folder;
//		$folder = 'C:\Users\win_wp\Desktop\tmp\\';
		$sclist = scandir($folder);
		foreach ($sclist as $value) {
			$item = $tmp_name.$value;
			echo $item."<br/>";
		}
	}


?>
</body>
</html>