我在使用unlink()
函数删除文件时遇到了问题。当文件名为西里尔字母时,该函数无法正常工作。
[2012年7月24日00:33:35 UTC] PHP警告: unlink(/home/gtsvetan/public_html/мениджър.doc) [function.unlink]:没有这样的文件或目录 在/home/gtsvetan/public_html/deleter.php的第114行
那么如何在文件名为西里尔字母时删除文件呢?
以下是代码:
$dir = is_array($dir) ? $dir : explode(',', $dir);
foreach($dir as $dirv) {
if(is_dir($dirv)) {
$objects = scandir($dirv);
foreach($objects as $object) {
if($object != "." && $object != "..") {
if(filetype($dirv."/".$object) == "dir") {
$this->delete($dirv."/".$object);
}
else {
unlink($dirv."/".$object);
}
}
}
reset($objects);
rmdir($dirv);
}
else {
unlink($dirv);
}
}
解决方案:
public function delete($dir) {
$dir = is_array($dir) ? $dir : explode(',', $dir);
foreach($dir as $dirv) {
if(is_dir($dirv)) {
$d = @dir($dirv) or die();
while(false !== ($entry = $d->read())) {
if($entry[0] == ".") {
continue;
}
if(is_dir($dirv.$entry.'/')) {
$this->delete($dirv.$entry.'/');
@rmdir($dirv.$entry);
}
elseif(is_readable($dirv.$entry)) {
@unlink($dirv.$entry);
}
}
$d->close();
}
else {
@unlink($dirv);
}
@rmdir($dirv);
}
}
这里是ajax.php,它创建了该类的实例:)
case 'delete':
$location = $_POST['location'];
if(is_array($location)) {
foreach($location as $v) {
$loc[] = iconv('utf-8', 'cp1251', $v);
}
$pfm->delete($loc);
}
else {
$location = iconv('utf-8', 'cp1251', $location);
$pfm->delete($location);
}
break;
对我来说它完美地运作了 :)
is_file()
检查文件是否存在,而不仅仅是它是否为文件。这就是@alex的意思。 - user405725is_file()
,但它无法将其检测为文件。 - user546774is_file()
作为条件执行unlink()
,就不应该出现竞争条件。 - alex