一時的に宣言された変数はメモリに保存されることがわかっているため、変数の内容を長期間保存したい場合は、静的変数をメモリに書き込むことができます。ファイルを作成してハード ドライブまたはサーバーに保存します。ファイル操作には慣れている必要があります。
1. ファイルの属性情報を取得します
まず第一に、Linux では、block (ディスク パーティション、CD-ROM などのブロック デバイス)、char (キーボードやプリンターなど、文字を入力として使用するデバイス)、dir (ディレクトリ) があります。タイプ、ディレクトリもファイルの一種です)、fifo(名前付きパイプ、説明はあるプロセスから別のプロセスに情報を転送することです)、ファイル(通常のファイル)、リンク(リンク、winのショートカットに似ています)、不明(不明なタイプ) 7 つのメジャー クラス、win では、file、dir、unknown の 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 'symbol link';
デフォルト: '不明な型' を返します;
}
}
コードをコピー
ファイルサイズはバイト単位でデータを返します。ファイルが大きい場合、または非常に大きい場合は、最初に数値を処理できます。
コードをコピー
// プロセスファイルサイズ
関数 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)){
return Round($size/pow(2, 10), 2).'KB';
}
その他{
return Round($size, 2).'Byte';
}
}
コードをコピー
それでは、ファイル情報を包括的に取得してみましょう。コードは次のとおりです。
コードをコピー
関数 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 Basename($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 'file Permission: '.substr(sprintf('%o', (fileperms($path))), -4).'
' // ファイル権限、8 進数出力
echo 'file group: '.filegroup($path).'
' // ファイルが存在するグループ
}
コードをコピー
効果は次のとおりです:
コードではファイルパーミッションやグループなどの機能も使用していますので説明が必要です(間違っていたら修正してください)。ファイルのパーミッションは、読み取り可能、書き込み可能、実行可能に分けられ、一般的には 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: '.$name.' type: '.filetype($filepath).'
';
}
Closedir($handle);
}その他{
echo $dir.' はディレクトリではありません
}
コードをコピー
効果は次のとおりです:
システムが実際にディレクトリの内容を大文字と小文字を無視した辞書で並べ替えていることがわかります。
ディレクトリのサイズを計算するには、filesize でファイルのサイズを取得できることはわかっていますが、PHP にはディレクトリのサイズを具体的に計算する関数はありません。もちろん、PHPにはハードディスクのサイズを計算する関数disk_total_space(ハードディスクの総容量を計算する)とdisk_free_space(ハードディスクの空き容量を計算する)がありますが、disk_free_spaceを試してみたところ、計算が間違っていたようです。 filesize はファイルのサイズを計算するため、ディレクトリの場合は再帰を使用する必要があり、ファイルの場合はサブディレクトリのサイズを計算し、コードを追加します。は次のとおりです:
コードをコピー
// ディレクトリ サイズの計算
関数 getDirSize($dirpath){
$size = 0;
if(false != ($handle = opendir($dirpath))){
while(false != ($file = readdir($handle))){
続ける;
$filepath = $dirpath.'/'.$file;
(IS_FILE ($ Filepath)) {// がファイルの計算サイズである場合
$size += ファイルサイズ($filepath);
}
else if(is_dir($filepath)){使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する」 s ‐to ‐‐ ‐‐‐ ‐to、
$size += getDirSize($filepath);}
else{
$size += 0;
}
Closedir($handle);
}
$size を返します;
}
$dirsize = 'F:/size';
$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 ではファイル削除関数のリンク解除しか提供していないため、ディレクトリを削除する場合は、それを自分で作成する必要があります。最初に opendir を入力し、次に Enter キーを押します。ファイルの場合は直接削除します。ディレクトリの場合は、続けて入力し、このメソッドを使用して処理します。もちろん、削除が成功したかどうかを示すブール変数を返すことができます。コードは次のとおりです:
コードをコピー
// ファイルのリンクを削除
// ディレクトリの内容を削除してから、ディレクトリを削除します
関数clearDir($dirpath){
if(file_exists($dirpath)){
if(false != ($handle = opendir($dirpath))){
while(false != ($name = readdir($handle))){
if($name == '.' $name == '..')
続行;
$filename = $dirpath.'/'.$name;
clearDir($filename);
@unlink($filename);
}
Closedir($handle);
}
その他{
false を返す;
}
}
その他{
false を返す;
}
true を返します;
}
コードをコピー
ここで私が遭遇した大きな落とし穴は、これら 2 つのゴースト (ドットとドット) が、オペレーティング システムのすべてのフォルダーの下に存在することです。恐ろしいのは、 . と .. が各ディレクトリの先頭にあり、最初に読み取る必要があるため、ディレクトリを読み取るときに表示されず、再帰関数が無限ループになってしまうことです。フィルタリングされていない場合、最初にこのディレクトリを表す . を読み取り、次に再帰的にこのディレクトリに入ります...これら 2 つはオペレーティング システムのデフォルトのもので、このディレクトリと上位ディレクトリの間のコネクタです。レベルのディレクトリ。
ディレクトリのサイズを計算し、空でないディレクトリのコードを削除することで、コピーとディレクトリの切り取りを非常に簡単に作成できます。非常に似た再帰的なアイデアでは、ファイル コピー関数 copy とファイル移動関数 rename を使用する必要があります。これは非常に興味深いものです。rename 、文字通り名前を変更しますが、別のディレクトリに名前を変更するということは、それをカットすることを意味するのではありませんか? -_-
3. ファイルの読み取りと書き込み
PHP での特定のファイル読み取り操作は C 言語に非常に似ているため、手順はまずファイルを開いてハンドルを取得し、エラーを確認してから読み取りと書き込みを行ってから閉じるというものです。開いて処理した後に閉じる習慣 C 言語でファイルを閉じないと、2 回開くとエラーが報告されるということを覚えておくと良いでしょう。プログラムは厳密です。最初にファイルが存在することを確認し、次に書き込み可能であることを確認し、次にファイルを閉じてから再度開くなど、ファイルを開くときに正しく開かれたかどうかを確認する必要があります。 ... ファイルを開くときは、ファイルを開くモードを選択する必要があります。これは、ファイルを読み取るか書き込むかを決定します。もちろん、そのような操作が必要な関数には便利です。
ファイル書き込み関数は fwrite、fputs、file_put_contents の 2 つだけです。このうち、fwrite は fputs と同じ効果を持ちます。指定する必要はありません。同時に、
のように既存のファイルの内容を追加することもできます。
コードをコピー
// fwrite(alias fputs) を書き込みます
$filepath = 'F:/10m.txt';
関数 writeSome($filepath){
if(($handle = fopen($filepath, 'r+')) == true){
for($i=0; $i
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)) {// ファイルの末尾に到達するかどうかを決定します
echo $str.'
';
}
} }
}
コードをコピー
より柔軟な読み取り方法が必要な場合は、ファイル ポインターを特定の位置に移動できる fseek を使用する必要があり、先頭または末尾に直接移動したり、前方に移動したりできます。または現在位置から逆方向に移動して、目的のコンテンツを読み取ります。ftell は次のような現在の位置を通知することもできます。
コードをコピー
関数 readFun($filepath){
if(($handle = @fopen($filepath, 'r')) != false){
echo 'current location: '.ftell($handle).'
$str = fread($handle, 3); // 3 バイトを読み取ると、ポインターは自動的に 3 バイト戻ります
echo '内容を読み取ります: '.$str.'
';
echo '現在の位置: '.ftell($handle).'
';
echo '現在位置: '.ftell($handle).'
';
$str = fread($handle, 5);
echo '内容を読み取ります: '.$str.'
';
echo '現在の位置: '.ftell($handle).'
';
echo '現在位置: '.ftell($handle).'
';
echo '現在位置: '.ftell($handle).'
} }
}