【问题标题】:php rename() works with argv but not using php://stdinphp rename() 适用于 argv 但不使用 php://stdin
【发布时间】:2013-12-29 19:24:06
【问题描述】:

我意识到这里需要重新考虑其他一些事情,但只是试图让提示暂时起作用。

我想重命名一个文件夹。这在使用 argv 时有效,但在提示输入新名称时无效。

使用 php rename.php foo 调用有效

重命名.php

$baseDir = __DIR__.'\\app\\';
$name = $argv[1];
if(is_dir($baseDir.'src')) {
    rename($baseDir.'src',  $baseDir.$name);
}

提示输入新名称会引发错误

PHP Warning: rename(C:\Users\lotus\projects\apisUWontHate\app\src,C:\Users\lotus\projects\apisUWontHate\app\foo
): The filename, directory name, or volume label syntax is incorrect. (code: 123)

重命名.php

$baseDir = __DIR__.'\\app\\';

echo 'Enter the name for your app. This will be the root namespace.';
$handle = fopen('php://stdin', 'r');
$name = fgets($handle);
fclose($handle);

if(is_dir($baseDir.'src')) {
    rename($baseDir.'src',  $baseDir.$name);
}

我尝试检查类型并回显结果,但两者完全相同

echo gettype($name);// string
echo $baseDir.$name;// C:\Users\lotus\projects\apisUWontHate\app\foo

我在这里没有正确使用标准输入还是有其他可能导致错误消息的原因?

【问题讨论】:

  • 除非您的文件名以换行符结尾,否则您需要修剪 fgets() 的输入,因为它包含新行
  • 从标准输入(和 fgets)读取时,通常会得到一个额外的换行符;这就是警告可能抱怨的内容。
  • @MarkBaker 你想把它作为答案吗?我会接受它,因为你是第一个。有史以来最快的答案:-)

标签: php stdin argv


【解决方案1】:

除非您的文件名以换行符结尾,否则您需要修剪 fgets() 的输入,因为它包含新行

从 php.net 文档页面引用fgets()

当长度 - 1 个字节被读取或换行时,读取结束 (包含在返回值中)或 EOF(以 先来)。

(我的重点)

【讨论】:

    猜你喜欢
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 2021-04-23
    • 2017-10-28
    • 2015-01-21
    相关资源
    最近更新 更多