2010-12-29 58 views
3

空白、,()!などのような特殊文字を含む古いファイルをPHPで削除する必要があります。 Classic unlink($filename)はこれらのファイルでは機能しません。どのように私はファイル名をunlink関数とファイルシステムを受け入れるファイル名に変換できますか?それはSolarisマシン上で実行されており、別のアクセス権は持っていません。ファイル名に特殊文字を含むファイルを削除する

答えて

2

どのように$filenameを構築していますか?あなたが通常のエスケープ処理を行う場合、unlinkは特殊文字を含むファイル名で動作するはずです。例えばthis has, various/wonky !characters in itの名前を持つファイルの

、その後、

$filename = 'this has\, various\/wonky \!characters in it'; 
unlink($filename); 

が動作するはずです。

+0

ファイル名はreaddirコマンドから出力されます。ディレクトリ内のファイルがidデータベースで使用されている場合と比較し、そうでない場合は削除します。私はこのファイル名をエスケープしません。自動エスケープする方法はありますか?私は、 "¼ľčš"のようなcp-1250文字があることを付け加える必要があります。 – gadelat

+1

シェルメタキャラクタを含むファイル名を扱っている場合は、それらをエスケープする必要があります。 Unlinkはあなたがあなた自身でそれをエスケープしない限り、ファイル名の '/'が実際にファイル名の一部であり、ディレクトリ区切り文字ではないことを知りません。 –

+0

cp-1250文字は問題ではないはずです。なぜなら、PHPやglibcが別のコードページ/文字セットで同時に動作していない限り、問題はありません。 "外国"の文字セット内のアクセント付き文字の1つが、 '/'のようなシェルメタキャラクタの1つに偶然にマップされる可能性はありますが、それでは正方形に戻ります。 –

0

Linuxでやる方法は、 "rm ./filename"のような絶対パスをドットスラッシュで使用することです。

エスケープ文字を使用することもできます。 "rm \ -filename"のように、 - バックスペースハイフンです。

1

unlinkは有効な文字列を受け入れ、その文字列のファイルを削除しようとします。

unlink('/home/user1/"hello(!,'); 

おそらく、特定の文字を正しくエスケープしていない可能性があります。

1

また、すべての必要なファイルを見つけて、RegexIterator使用してそれらのリンクを解除することができます(「」)このコードスニペットは、再帰的に現在のすべてのディレクトリをトラバース

<?php 

$dir = new RecursiveDirectoryIterator('.'); 
$iterator = new RecursiveIteratorIterator($dir); 
$regex = new RegexIterator($iterator, '/(^.*[\s\.\,\(\)\!]+.*)/', RecursiveRegexIterator::GET_MATCH); 

foreach ($regex as $file) { 
     if (is_file($file[0])) { 
       print "Unlink file {$file[0]}\n"; 
       unlink($file[0]); 
     } 
} 

をして/(^ 」正規表現ですべてのファイルと一致します。 [\ s \ ,.()!] +。)/ 'と入力して削除します。

関連する問題