【发布时间】:2012-03-04 15:42:36
【问题描述】:
我的 php.ini 有一个奇怪的问题。每当我尝试使用 rename() 移动文件时,不仅文件没有移动,而且应该复制到的目录以及其中的所有文件都被删除。原代码为:
rename('temp.odt', 'tmp/report.odt');
但我已经尝试过其他路径分隔符,例如
rename('temp.odt', 'tmp\report.odt');
rename('temp.odt', 'tmp\\report.odt');
rename('temp.odt', 'tmp' . DIRECTORY_SEPARATOR . 'report.odt');
rename('C:\wamp\www\zaiko\temp.odt', 'C:\wamp\www\zaiko\tmp\report.odt');
一切都无济于事。代码来自我正在开发的系统中使用的第 3 方模块。
检查点很好:
- 当前目录中确实存在文件“temp.odt”;
- 目录“tmp”确实存在,并且其中有几个文件。而且它不是只读的。
- 目标文件尚不存在(实际文件名有时间戳,为简单起见,我在这里缩小了)
运行 rename() 后,'temp.odt' 文件在其原始位置完好无损,而文件夹 'tmp' 以及其中的所有内容都消失。发出以下警告:
( ! ) 警告:rename(temp.odt,tmp\report.odt) [function.rename]:系统找不到指定的路径*。 (代码:3)在 C:\wamp\www\zaiko\modules\mod_deliver.php 第 192 行
*翻译自葡萄牙语
运行:Apache 2.2.17 和 PHP 5.3.5 在 Windows XP 和 NTFS 上
编辑:
刚刚找到问题的原因。事实证明,应用程序使用的模块反过来又使用了一个压缩库;此库使用与应用程序使用的名称完全相同的临时文件夹。
它必须使用某种缓存,这可以解释为什么错误没有出现 100% 次。
通过将“tmp”文件夹的名称更改为其他名称解决了问题。
感谢大家的宝贵时间,也很抱歉用这么愚蠢的事情打扰你们,事实证明,这与我最初的猜测完全无关,因此也与提出的问题无关。
【问题讨论】:
-
如果将文件复制到新位置然后删除原始文件会怎样?
-
你能把模块的代码贴在某个地方吗?至于php.net上的cmets,其他人没有这个问题。 Bugtracker 告诉
rename不会覆盖 WinXP 上的现有文件,但这与您描述的问题不同。也许,某处有清理“tmp”目录的代码? -
可能是调用 rename() 时文件句柄(用于原始文件)尚未释放?鉴于该项目运行所在机器的特性,我倾向于认为这是问题所在。
-
您是否尝试过使用
realpath()? -
@SérgioDomingues 嗯,这可能是可能的。所以
is_writable在这里会有所帮助,我想。