【问题标题】:PHP rename/copy...file_put/get_contents?PHP 重命名/复制...file_put/get_contents?
【发布时间】:2012-03-31 15:56:38
【问题描述】:

我已经尝试了很多方法来解决我的问题,但还没有遇到有效的解决方案...
问题很简单...
假设你有这个目录结构:

/website
  /admin
    /phpscript.php
  /img
    /folder1
      /image1.png
      /image2.png

我基本上想做的是: 创建一个文件夹...例如:folder2

/website
  /admin
    /phpscript.php
  /img
    /folder1
      /image1.png
      /image2.png
    /folder2

然后将image1和image2移动到文件夹2中

php 脚本位于 admin 中,这是我设计要执行的移动操作的地方。

我试过了:
rename('../img/folder1/image1.png', '../img/folder2/image1.png'); 失败了

copy('../img/folder1/image1.png', '../img/folder2/image1.png'); 也失败了


当文件的路径相同时,我可以使用复制和重命名...例如:

rename('../img/folder1/image1.png', '../img/folder1/image3.png');

这个将image1.png重命名为image3.png(image1.png不再存在于服务器上,image3.png是服务器创建的)

copy('../img/folder1/image1.png', '../img/folder1/image3.png');

这产生了一个名为 image3.png 的 image1.png 的副本(image1.png 和 image3.png 都在服务器上) apache 服务器中的文件夹具有所有权限
...我注意到你可以这样做:

file_get_contents('../img/folder1/image1.png')
and then do
file_put_contents('../img/folder2/image1.png')

只要文件夹存在...由于某种原因,当 mkdir() 在 file_put_contents() 之前使用时,它不喜欢移动

这基本上是我的代码:

$path = "img/"; //Generated somewhere in code above
$old_folder = "folder1/"; //Generated somewhere in code above
$folder = "folder2/"; //Generated somewhere in code above

$tmp_old_path = "../$path$old_folder";
$tmp_new_path = "../$path$folder";

mkdir($tmp_new_path);

$FP = scandir($tmp_old_path);

foreach ($FP as $key => $val){
    if($val != '.' && $val != '..'){
        $str_contents = file_get_contents($tmp_old_path.$val);
        file_put_contents($tmp_new_path.$val, $str_contents);
    }
}

【问题讨论】:

  • “失败”怎么办?有任何错误信息吗?
  • 你是在 Linux 上工作还是在 Windows 上工作?如果使用 Linux,你应该检查 folder2 的权限。
  • 你的脚本对folder2有写权限吗?
  • failed = 返回 false/什么都没发生创建新文件夹...
  • 激活错误报告和/或查看您的日志。如果文件无法移动/访问/打开,通常会生成警告。

标签: php copy rename file-get-contents


【解决方案1】:

试试下面的sn-p。确保您有足够的权限执行exec 命令

<?php
$cmd = 'mv "../img/folder1/image1.png" "../img/folder2/image1.png"';
exec($cmd, $output, $return_val);

if ($return_val == 0) {
   echo "success";
} else {
   echo "failed";
}
?>

【讨论】:

  • 如果是 rename(大多数 linux 风格的服务器中的默认行为),如果目标路径不存在,但无法授予文件权限,它会隐式调用 mkdir()。所以需要显式调用chmod
【解决方案2】:

我找到了问题的答案...

这是我使用的服务器的权限问题。

我能够转移到另一台服务器,现在我可以使用重命名功能。

现在我知道了-.-

$old_folder = 'image/folder1';
$new_folder = 'image/folder2';

rename($old_folder, $new_folder);

这通常是我在网上看到的权限问题...derp!

【讨论】:

  • 我也删除了 mkdir()...不需要它,因为 rename 隐式使用它。我使用的服务器无法创建具有公共写入权限的文件夹。所以我切换到另一台服务器并修复了它......
猜你喜欢
  • 2016-09-02
  • 2015-06-05
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 2016-08-04
  • 2018-08-17
  • 2015-06-09
  • 2014-11-28
相关资源
最近更新 更多