以前は C 言語でディレクトリ トラバーサル + ファイル コピー プログラムを作成していましたが、これは非常に長くて複雑でした。今では PHP を使用してディレクトリをトラバースできるようになり、コードが大幅に短縮されました。このプログラムの目的は、ディレクトリを走査し、指定されたファイル名を持つすべてのファイルを検索し、指定された文字列を削除することです。
{
$isbak = true; //元のファイルをバックアップするかどうか、true はバックアップを意味し、false はバックアップしません
グローバル $tmpfiledir;
$fr = fopen($tmpfiledir,"r") または die('一時ファイルを開けませんでした');
while($row = fgets($fr))
{
If(empty($row)) ブレーク;
$row = トリム($row);
$opp = fopen($row,"r") または die("$row を開けませんでした");
$str = fread($opp,filesize($row)) または die("$row を読み取れません");
$str = str_replace($getstr,"",$str);
fclose($opp);
if($isbak){
copy($row,$row.'.bak') または die("バックアップ ファイルが失敗しました");
}
$ref = fopen($row,"w") または die("ファイルを再度開くことができませんでした");
fwrite($ref,$str) または die("ファイルの書き換えに失敗しました");
}
}
関数トラバース($path) {
グローバル $name,$tmpfiledir;
$current_dir = opendir($path); //opendir() はディレクトリハンドルを返し、失敗した場合は false を返します
if($current_dir == false)
false を返します;
While(($file = readdir($current_dir)) !== false) { //readdir() は、開いているディレクトリ ハンドルのエントリを返します
$sub_dir = $path . DIRECTORY_SEPARATOR . $file ;
If($file == '.' || $file == '..') {
続けてください;
} else if(is_dir($sub_dir)) { //ディレクトリの場合は再帰を実行
トラバース($sub_dir);
} else { //ファイルの場合は再度比較します
$fileinfo = pathinfo($sub_dir);
If($fileinfo['basename'] == $name)
{
$fopen = fopen($tmpfiledir,"a");
fwrite($fopen,$sub_dir."rn");
Fclose ($ FOPEN)
}
}
}
true を返します;
}
if(isset($_POST["name"]) && isset($_POST["dir"]) && isset($_POST["str"]))
{
$name = $_POST["名前"];
Traverse($_POST["dir"]) または die("一時ファイルの作成に失敗しました。Web サイトのルート ディレクトリが書き込み可能かどうか確認してください");
del($_POST["str"]);
「成功」をエコーする;
リンクを解除($tmpfiledir);
}
それ以外は
{
echo "
関連情報を入力
";2 つの関数を作成したことがわかります。関数 traverse は一時ファイルにある指定されたファイル パスを書き込み、関数 del はこれらのファイル内の指定された文字列を削除します。実際、私もこれは無駄だと思います。トラバーサル中に直接削除するだけでよく、一時ファイルを生成する必要はまったくありません。
実は最初はC言語でトラバースを書いたのですが、C言語はファイル操作が難しいので、削除した部分だけPHPを使って書きました。 traversal ファイルも PHP で作成したので (C よりもはるかに簡単なようです)、別の関数 traverse を作成しました。トラバーサル部分だけを見て、以前に C で書いたトラバーサル コード (ソース コードを送信しました) と比較して、違いを確認することもできます。
ただし、このバージョンではワイルドカードがサポートされていないため、ファイル名を指定する必要があります。その機能 (これを書いた理由でもあります) は、サーバー上にハングした 1 文のトロイの木馬をバッチで削除できることです。