ホームページ >バックエンド開発 >PHPチュートリアル >PHP ファイル ディレクトリの基本操作の詳細_PHP チュートリアル

PHP ファイル ディレクトリの基本操作の詳細_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:14:21915ブラウズ

PHP ファイル ディレクトリの基本操作について詳しく説明します

一時的に宣言された変数は、スクリプトの実行が終了すると解放されることがわかっています。 1 つの方法は、コンテンツをファイルに書き込んでハードディスクまたはサーバーに置くことです。このためには、ファイル操作に精通している必要があります。

1. ファイルの属性情報を取得します

まず第一に、Linux では、ファイルにはタイプがあります。block (ディスク パーティションや CD-ROM などのブロック デバイス)、char (キーボードやプリンターなど、文字を入力として使用するデバイス)、および dir (ディレクトリ タイプ) があります。ディレクトリもファイルの一部です。species)、fifo (名前付きパイプ、あるプロセスから別のプロセスに情報を転送するためのものです)、file (通常のファイル)、link (リンク、win のショートカットに似ています)、unknown (不明なタイプ) 7 つのカテゴリ。win では、ファイル、ディレクトリ、不明の 3 つのカテゴリのみがあります。 Linux のクソ野郎は、Linux を頑張らなければならないと言いました。彼は完全に Linux のために生まれてきたのです。

タイプを取得するための関数がいくつかあります: filetype: タイプを取得; is_file: それが通常のファイルであるかどうかを判断します; is_link: それがリンクであるかどうかを判断します。

属性を取得するための関数がいくつかあります:

file_exists: ファイルまたはディレクトリが存在するかどうかを判断します。

filesize: ファイル サイズを取得します。

is_readable、is_writable、is_executable: 読み取り可能、書き込み可能、​​実行可能かどうか

filectime、filemtime、fileatime: ファイルの作成時刻 (create)、変更時刻 (modify)、アクセス時刻 (access) を取得し、すべてタイムスタンプを返します。

stat: ファイルに関する基本情報を取得し、インデックスと関連付けの混合配列を返します。

たとえば、次のようにファイルタイプを決定できます:

コードは次のとおりです:

function getFileType($path){ // ファイルの種類を取得します

switch(ファイルタイプ($path)){
case 'file': return '通常のファイル';
case 'dir': return 'directory';
case 'block': return 'block device file';
case 'char': return 'char に基づいてデバイスを転送';
case 'fifo': return '名前付きパイプ';
case 'link': return 'シンボルリンク';
デフォルト: '不明な型' を返します;
}
}


filesize はバイト単位でデータを返します。ファイル番号が大きい場合、または非常に大きい場合、コードは次のとおりです。

コードは次のとおりです:

// ファイルサイズを処理します

関数 getSize($path = '', $size = -1){
if($path !== null && $size == -1){ // パスのみを渡してサイズを計算するか、数値のみを処理するようにすることもできます
$size = ファイルサイズ($path);
}
if($size >= pow(2, 40)){
return Round($size/pow(2, 40), 2).'TB';
}
else if($size >= pow(2, 30)){
return Round($size/pow(2, 30), 2).'GB';
}
else if($size >= pow(2, 20)){
return Round($size/pow(2, 20), 2).'MB';
}
else if($size >= pow(2, 10)){
ラウンドを返します($size/pow(2, 10), 2).'KB';
}
他{
ラウンドを返します($size, 2).'バイト';
}
}



それでは、ファイル情報を包括的に取得しましょう。コードは次のとおりです。

コードは次のとおりです:

関数 getFileInfo($path){

if(!file_exists($path)){ // ファイルが存在するかどうかを判断します

echo 'ファイルが存在しません!
';

戻ります;
}
if(is_file($path)){ // ファイルです、基本的なファイル名を出力します
echo ベース名($path)。' はファイルです
';
}
if(is_dir($path)){ // ディレクトリなのでディレクトリに戻ります
echo dirname($path).' はディレクトリです
';
}
echo 'file type:'.getFileType($path).'
' // ファイルの種類を取得します
echo 'file size:'.getSize($path).'
' // ファイルサイズを取得します
; if(is_readable($path)){ // 読み取れるか
echo ベース名($path)。' 読み取り可能です
';
}
if(is_writeable($path)){ // 書き込み可能ですか
echo ベース名($path)。' 書き込み可能です
';
}
if(is_executable($path)){ // 実行可能ですか
echo ベース名($path)。' は実行可能です
';
}
// タッチ機能はこれらの時間を変更できます
echo 'ファイル作成時刻: '.date('Y-m-d H:i:s', filectime($path)).'
' // 作成時刻
; echo 'ファイル変更時刻: '.date('Y-m-d H:i:s', filemtime($path)).'
' // 時刻を変更します
echo '最終アクセス時刻: '.date('Y-m-d H:i:s', fileatime($path)).'
' // 最終アクセス時刻
echo 'ファイル所有者: '.fileowner($path).'
' // ファイル所有者
echo 'ファイル権限: '.substr(sprintf('%o', (fileperms($path))), -4).'
' // ファイル権限、8 進数出力
echo 'file group: '.filegroup($path).'
' // ファイルが存在するグループ
; }



効果は次のとおりです:

详谈PHP文件目录基础操作 帮客之家

ファイルパーミッションやグループなどの機能も使用しているので説明が必要です(間違っていたら修正してください)。ファイルのアクセス許可は、読み取り可能、書き込み可能、​​実行可能に分けられ、一般的には rwx と表現されます。指定された値は前から 4、2、1 です。 3つの値を足した結果が7が一番大きいので、0666は8進数で表現できてとても便利そうです。 7 の場合、このファイルにはこれら 3 つのアクセス許可があることを意味します。なぜ 0666 が出力されるのでしょうか。 Windows にも、Windows と同様にユーザーが存在することは誰もが知っています。そのため、ユーザーには独自のグループとシステムが存在します。ファイル内のグループ (この分割は管理上の必要があると考えられます) であるため、0666 の場合、最初の 6 はファイルに対するユーザーのアクセス許可を表し、2 番目の 6 はファイルに対するユーザーのグループのアクセス許可を表し、3 番目の 6 はファイルに対するアクセス許可を示します。他のグループのアクセス許可 (このグループ以外の他のユーザーを 1 つずつ区別する必要がないように)、6 は、ファイルが読み取りおよび書き込み可能であることを意味します (Win で実行可能かどうかがわかります)。 )。

2. ディレクトリ操作

ディレクトリの読み取り、opendir: ディレクトリを開き、ディレクトリの内容を指すハンドルを返します。ディレクトリの内容が順番に並んだ配列などのシーケンシャルなデータと見なされる場合、このハンドルは最初にこれを指します。実際、システムは、ファイルであってもサブディレクトリであっても、ディレクトリの内容を辞書順に並べ替えます。 readdir: 次のディレクトリの内容を読み取り、ファイル名を返し、ディレクトリ内の次のファイル/ディレクトリを自動的にポイントします。そのため、サブディレクトリの内容を除くディレクトリの内容を読み取るには、After で制御するループが必要です。読み取りの場合、ハンドル変数はクローズされなければなりません。C 言語がファイルを開くときも閉じるときも同様です。私のマシンを例に挙げます:

コードは次のとおりです:


//ディレクトリを読み取ります
$dir = 'F://';
echo '.$dir.' の詳細
';
if(is_dir($dir)){
if(($handle = opendir($dir)) == false){ // ディレクトリハンドルを取得
echo 'ディレクトリを開くのに失敗しました';
戻ります;
}
while(($name = readdir($handle)) != false){ // このディレクトリの内容を読み取るループ
$filepath = $dir.'/'.$name;
echo '名前: '.$name.' タイプ: '.filetype($filepath).'
';
}
Closedir($handle); // ディレクトリハンドルを閉じます
}
他{
echo $dir.' はディレクトリではありません;
}

効果は次のとおりです:

详谈PHP文件目录基础操作 帮客之家

システムが実際にディレクトリの内容を大文字小文字を無視した辞書で並べ替えていることがわかります。

ディレクトリ サイズの計算、ファイル サイズが filesize によって取得できることはわかっていますが、PHP にはディレクトリ サイズを具体的に計算する関数はありません。もちろん、PHPにはハードディスクのサイズを計算する関数disk_total_space(ハードディスクの総容量を計算する)とdisk_free_space(ハードディスクの空き容量を計算する)がありますが、disk_free_spaceを試してみたところ、計算が間違っていたようです。 filesize はファイルのサイズを計算するため、ディレクトリの場合は再帰を使用する必要があり、ファイルの場合はサブディレクトリのサイズを計算し、コードを追加します。は次のとおりです:

コードは次のとおりです:


// ディレクトリサイズの計算
関数 getDirSize($dirpath){
$サイズ = 0;
if(false != ($handle = opendir($dirpath))){
while(false != ($file = readdir($handle))){
if($file == '.' || $file == '..') //フィルターディレクトリ内のドットとドットに注意してください
続けます;
$filepath = $dirpath.'/'.$file; // パスをたどる必要があります
if(is_file($filepath)){ // 計算されたファイルのサイズです
$size += ファイルサイズ($filepath);
}
else if(is_dir($filepath)){ // これはディレクトリであり、このディレクトリ内のファイルの計算を続けます
$size += getDirSize($filepath);
}
他{
$size += 0;
}
}
Closedir($handle);
}
$size を返します;
}
$dirsize = 'F:/サイズ';
$size = getDirSize($dirsize);
echo 'dir size: '.getSize(null, $size).'

' // 前のデータ処理関数を呼び出します

F ドライブにサイズのファイルを作成し、いくつかのサブディレクトリとドキュメントをランダムに作成しました。その結果は次のとおりです。左側はプログラムによって取得され、右側は右クリックしてフォルダーのプロパティを表示します。比較。

ディレクトリの作成と削除には主に mkdir: 新しいディレクトリを作成し、rmdir: 空でないディレクトリを削除します。 コードは次のとおりです。

コードは次のとおりです:


//ディレクトリの作成と削除
$newDirPath = 'F:/newDir';
if(true == @mkdir($newDirPath, 0777, true)){ // ファイルが既に存在する場合、PHP 自体が警告をスローする可能性があるため、@ を追加します
echo 'ディレクトリ '.$newDirPath' が正常に作成されました
';
}
他{
if(file_exists($newDirPath))
echo 'ディレクトリ '.$newDirPath.' は存在します
;
それ以外
echo 'ディレクトリ'.$newDirPathの作成に失敗しました
';
}
if(true == @rmdir('F:/aaa')) //空でないディレクトリのみを削除できます。存在しないディレクトリを削除すると、自動的に警告がスローされます
echo '正常に削除されました
';

それでは、空ではないディレクトリを削除したい場合はどうするかということですが、PHP はファイル削除関数 unlink しか提供していないため、ディレクトリを削除するときは最初に opendir を実行する必要があります。ファイルが直接削除された場合、それがディレクトリの場合は、引き続きこのメソッドを使用して、削除が成功したかどうかを示すことができます。コードは次のとおりです。

コードは次のとおりです:

// ファイルのリンクを削除
// ディレクトリの内容を削除してから、ディレクトリを削除します
関数clearDir($dirpath){
if(file_exists($dirpath)){
if(false != ($handle = opendir($dirpath))){
while(false != ($name = readdir($handle))){
if($name == '.' || $name == '..')
続けます;
$filename = $dirpath.'/'.$name;
if(is_dir($filename))
clearDir($filename);
if(is_file($filename))
@unlink($filename);
}
Closedir($handle);
rmdir($dirpath);
}
他{
false を返します;
}
}
他{
false を返します;
}
true を返します;
}

ここで遭遇する大きな落とし穴は . と .. これら 2 つのゴースト (ドットとドット) は、オペレーティング システムのすべてのフォルダーの下にあり、現在のディレクトリと上位ディレクトリを意味します。ディレクトリを読み取るときに、現在のディレクトリのディレクトリは表示されず、再帰関数が無限ループになります。これは、 . と .. が各ディレクトリの先頭にあり、フィルタリングされていない場合は最初に読み取る必要があるためです。このディレクトリを表す . を入力し、このディレクトリを再帰的に入力します... これら 2 つはオペレーティング システムのデフォルトのもので、このディレクトリと上位レベルのディレクトリの間のコネクタです。

ディレクトリのサイズを計算し、空でないディレクトリのコードを削除することで、ファイル コピー関数 copy とファイル移動関数 rename を使用する非常に似た再帰的なアイデアを作成することが非常に簡単になります。これは非常に興味深いものです。文字通り、名前を変更します。上記は名前を変更していますが、別のディレクトリに名前を変更するということは、それをカットすることを意味するのではありませんか?

3. ファイルの読み取りと書き込み

PHP の一部のファイル読み取り操作は C 言語に非常に似ているため、手順は、まずファイルを開いてハンドルを取得し、エラーを確認してから、読み取りと書き込みの処理を行ってから、適切なファイルを閉じるというものです。開いて処理した後に閉じる習慣があるので、C言語のファイルを2回開くとエラーが報告されることを覚えておいてください。したがって、厳密なプログラムでは処理がたくさんあります。たとえば、最初にファイルが存在することを確認し、次にそのファイルが読み取り可能および書き込み可能であることを確認してから、最初にファイルを閉じてから再度開くと、ファイルが正しく開かれたかどうかを確認する必要があります。ファイルを開くときは、ファイルを開くモードを選択する必要があります。これは、ファイルを読み取るか書き込むかを決定します。もちろん、このような操作が必要な関数には便利です。

ファイル書き込み関数は fwrite、fputs、file_put_contents の 2 つだけです。このうち、fwrite はファイルにコンテンツを一度に書き込みます。同時に、次のような既存のファイルのコンテンツを追加または上書きすることもできます。

コードは次のとおりです:

// fwrite(alias fputs) を書き込みます

$filepath = 'F:/10m.txt';
関数 writeSome($filepath){
if(($handle = fopen($filepath, 'r+')) == true){
for($i=0; $i fwrite($handle, $i." write somethingrn"); //windws は改行文字として rn を使用します
fclose($handle);
}
}
file_put_contents($filepath, 'file_put_contents 関数を使用', FILE_APPEND); // 追加コンテンツ


ファイルを読み取る fread (指定されたバイトを読み取る)、fgetc (1 行を読み取る)、fgets (1 行を読み取る)、file (すべてを読み取り、行ごとに配列に割り当てて返す)、file_get_contents (デフォルトで返された文字列をすべて読み取ります)、readfile (ファイルの内容をキャッシュに直接出力します。その結果、ブラウザに直接出力されます)、fread、fget、fgets を実行すると、ファイル ポインタが自動的に後方に移動します。したがって、連続読み取りはループによって制御するのが最適です。ファイルの終わりに達した場合はどうすればよいですか? EOF フラグは、ファイルの終わりに達したかどうかを検出するために feof を使用するのが最善です。早速、コードを見てみましょう:

コードは次のとおりです:


// 読んでください
関数 readSome($filepath){
if(($handle = @fopen($filepath, 'r')) == true){
while(!feof($handle)){ // ファイルの終わりに達したかどうかを判定します
$str = fread($handle, 10); // fread が読み込むと、ファイル ポインタは自動的に後方に移動します
echo $str.'
';
}
}
}

より柔軟な読み取り方法が必要な場合は、fseek と巻き戻しを使用する必要があります。fseek は非常に柔軟で、ファイル ポインターを特定の位置に移動したり、先頭または末尾に移動したりできます。読みたい現在の位置を取得します。ftell は次のような現在の位置も通知します。

コードは次のとおりです:

関数 readFun($filepath){
if(($handle = @fopen($filepath, 'r')) != false){
echo 'current location: '.ftell($handle).'
' // ファイルの現在のファイルポインタ位置をバイト単位で出力します。0 は先頭を意味します
$str = fread($handle, 3); // 3 バイトを読み取ると、ポインターは自動的に 3 バイト戻ります
echo '内容を読み取ります: '.$str.'
';
echo '現在位置: '.ftell($handle).'
';
fseek($handle, 5, SEEK_CUR); // ファイルポインタを現在の位置から 5 バイト戻します
echo '現在位置: '.ftell($handle).'
';
$str = fread($handle, 5);
echo '内容を読み取ります: '.$str.'
';
echo '現在位置: '.ftell($handle).'
';
rewind($handle); // ファイルの先頭に戻ります
echo '現在位置: '.ftell($handle).'
';
fseek($handle, 0, SEEK_END); // ファイルの末尾に移動します
echo '現在位置: '.ftell($handle).'
';
fclose($handle); // ファイルを閉じます
}
}

たとえば、私は今、このメソッドを使用して、a から z まで書かれたテキスト ファイルを読み取り、その効果を確認しています。

以上はPHPのディレクトリファイル操作に関する個人的な理解の記録でもあります

http://www.bkjia.com/PHPjc/909796.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/909796.html技術記事 PHP ファイル ディレクトリの基本的な操作について詳しく説明します。一時的に宣言された変数は、スクリプトの実行終了後に解放されることがわかっています。 ..
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。