rename() 函数用于重命名文件或目录,也可以移动文件到新位置。这个函数既可以改变文件名,也可以改变文件的位置,或者同时改变两者。
当目标文件已存在时,如果权限允许,rename() 会覆盖目标文件。在Windows系统中,如果目标文件已存在且没有被占用,操作会成功;在Unix/Linux系统中,如果目标文件已存在,它会被替换。
rename ( string $oldname , string $newname [, resource $context ] ) : bool
参数说明:
$oldname:原始文件或目录的路径(必需)$newname:新的文件或目录路径(必需)$context:上下文资源(可选,通常用于流操作)| 参数 | 描述 |
|---|---|
oldname |
原始文件或目录的路径。必需参数。
|
newname |
新的文件或目录路径。必需参数。
|
context |
上下文资源。可选参数。
|
truefalse,通常是由于以下原因:
重命名一个文件:
<?php
$oldname = 'old_file.txt';
$newname = 'new_file.txt';
if (rename($oldname, $newname)) {
echo "文件重命名成功!";
} else {
echo "文件重命名失败。";
}
?>
将文件移动到不同的目录:
<?php
$oldname = 'uploads/temp.jpg';
$newname = 'images/profile.jpg';
// 确保目标目录存在
if (!file_exists('images')) {
mkdir('images', 0755, true);
}
if (rename($oldname, $newname)) {
echo "文件移动成功!";
} else {
echo "文件移动失败。";
// 获取更多错误信息
$error = error_get_last();
if ($error) {
echo " 错误信息: " . $error['message'];
}
}
?>
重命名一个目录:
<?php
$olddir = 'temp_data';
$newdir = 'archived_data';
if (is_dir($olddir)) {
if (rename($olddir, $newdir)) {
echo "目录重命名成功!";
} else {
echo "目录重命名失败。";
}
} else {
echo "源目录不存在。";
}
?>
批量重命名一个目录中的所有文件:
<?php
$directory = 'photos';
$prefix = 'vacation_';
$counter = 1;
if (is_dir($directory)) {
$files = scandir($directory);
foreach ($files as $file) {
if ($file === '.' || $file === '..') continue;
$oldpath = $directory . '/' . $file;
$extension = pathinfo($file, PATHINFO_EXTENSION);
$newpath = $directory . '/' . $prefix . $counter . '.' . $extension;
if (rename($oldpath, $newpath)) {
echo "重命名 {$file} 为 {$prefix}{$counter}.{$extension}<br>";
$counter++;
} else {
echo "重命名 {$file} 失败<br>";
}
}
}
?>
使用上下文资源进行重命名操作:
<?php
// 创建上下文(虽然rename()通常不需要特殊的上下文)
$context = stream_context_create([
'http' => [
'method' => 'GET',
'header' => "User-Agent: PHP\r\n"
]
]);
$oldname = 'data.txt';
$newname = 'backup_data.txt';
if (rename($oldname, $newname, $context)) {
echo "使用上下文重命名成功!";
} else {
echo "重命名失败。";
}
?>
rename() 不会自动创建目录rename() 不能跨不同的文件系统/设备移动文件rename() 会重命名链接本身,而不是链接指向的文件error_get_last() 获取详细错误信息basename() 或 realpath() 处理路径<?php
function safe_rename($oldname, $newname) {
// 验证文件存在
if (!file_exists($oldname)) {
return ['success' => false, 'error' => '源文件不存在'];
}
// 确保目标目录存在
$target_dir = dirname($newname);
if (!is_dir($target_dir)) {
if (!mkdir($target_dir, 0755, true)) {
return ['success' => false, 'error' => '无法创建目标目录'];
}
}
// 尝试重命名
if (rename($oldname, $newname)) {
return ['success' => true, 'error' => null];
} else {
$error = error_get_last();
return ['success' => false, 'error' => $error['message'] ?? '未知错误'];
}
}
// 使用安全的重命名函数
$result = safe_rename('source.txt', 'backup/source.txt');
if ($result['success']) {
echo "操作成功!";
} else {
echo "操作失败: " . $result['error'];
}
?>
rename() 通常是一个原子操作(在同一个文件系统内),而 copy()+unlink() 不是原子的。rename() 通常更快,因为它只修改目录条目而不复制文件数据。但如果跨不同的文件系统,rename() 实际上会执行复制+删除操作。
rename() 可能失败。这种情况下应该使用 copy() 复制文件,然后用 unlink() 删除原文件。一些操作系统允许跨文件系统的 rename(),但具体行为因系统而异。
rename() 只能用于本地文件系统。对于远程文件(通过HTTP、FTP等),需要特定的协议支持,通常使用相应的库函数。