2011-10-26 77 views
0

我有一个使用我的控制之外的流媒体服务器流式传输大型视频文件,有时我想删除的视频文件。当文件碰巧被使用流式服务器的人查看时,PHP错误带有“权限被拒绝”。在PHP中,检查文件是否可以被删除

我想尝试删除该文件可以删除或不前检查。我不想真的尝试删除文件,看看是否失败,我想事先检查。

这是我到目前为止的代码:

$file = "video.flv"; 
$file2 = "newvideoname.flv"; 
clearstatcache(); 
if (is_writeable($file)) { 
    echo "is writeable"; 
} 
else { 
    echo "is NOT writeable"; 
} 
echo "\n"; 
$fh = fopen($file, 'a+'); 
if (!flock($fh, LOCK_EX | LOCK_NB)) { 
    // file locked, do something else 
    echo "is locked"; 
} 
else { 
    echo "not locked!"; 
} 
fclose($fh); 
echo "\n"; 
if (touch($file)) { 
    echo "modification time has been changed to present time"; 
} 
else { 
    echo "Sorry, could not change modification time"; 
} 
echo "\n"; 
rename($file, $file2); 

,当我在执行码流video.flv我得到的输出:

is writeable 
not locked! 
modification time has been changed to present time 
PHP Warning: rename(video.flv,newvideoname.flv): Permission denied in ... 

有时候我:

is writeable 
PHP Warning: fopen(video.flv): failed to open stream: Permission denied ... 
PHP Warning: flock() expects parameter 1 to be resource, boolean given 
is locked 
PHP Warning: fclose(): supplied argument is not a valid stream resource 
PHP Warning: touch(): Utime failed: Permission denied 
Sorry, could not change modification time 
PHP Warning: rename(video.flv,newvideoname.flv): Permission denied ... 

所以有时文件不能被PHP锁定,也不能被PHP触摸(),当然重命名也不起作用,但如此一次PHP说“一切都好”,直到重命名命令。重命名命令有从来没有工作随机机会。

我应该怎么做与文件?

+0

那么文件权限呢? –

+0

@KA_lin不是问题,当视频没有被流式传输时,重命名命令完美地起作用 – Tominator

+0

所以问题是什么? –

回答

3
if (!flock(fopen($file, 'a+'), LOCK_EX | LOCK_NB)) { 

您正在锁定文件。确保你如果调用成功再次解锁(刚过echo "not locked!";

+0

更新我的代码来解锁文件,但它具有相同的效果 – Tominator

+0

您已经关闭了文件,你也解除了吗? – fredley

+1

直接从PHP手册中获得:“锁也是由fclose()释放的(当脚本完成时它也被自动调用)。” – Tominator

1

,因为我看到的是,当你检查,如果该文件被锁定与flock你打开一个资源文件,但没有关闭该文件的问题。所以文件现在被锁定,你不能重命名它

+0

更新我的代码来解锁文件,但它具有相同的效果 – Tominator

+0

我想这就是原因其实 –

+0

@Tominator你也使用'FCLOSE()' – JRSofty

0

你不能删除一个文件是流...如果你真的想...做一个副本,它的名称,并把文件(原始)在堆栈(DB),并有一个cron作业什么的把它删除...

+0

不是问题,当视频不被流,重命名命令完美的作品 – Tominator

+0

所以,即使你得到“未锁定”的消息你还是不能老是重命名? –

+0

事实上,即使有消息“未锁定”和当前的代码示例,我也无法重命名/删除。重命名发生在fclose之后,所以把它放在else分支中并没有真正的区别。 – Tominator

-1

解决办法是在这里:

$file = "test.pdf"; 

if (!is_file($file)) { 
    print "File doesn't exist."; 
} else { 
    $fh = @fopen($file, "r+"); 
    if ($fh) { 
     print "File is not opened and seems able to be deleted."; 
     fclose($fh); 
    } else { 
     print "File seems to be opened somewhere and can't be deleted."; 
    } 
} 
相关问题