【问题标题】:fopen: failed to open stream: No such file or directory - but file/directory existsfopen:无法打开流:没有这样的文件或目录 - 但文件/目录存在
【发布时间】:2020-02-13 19:00:49
【问题描述】:

编辑:最初我简化了原始 csv 文件(从 com1_webscrapersolution_new_email-10-02-20.csvproducts.csv)以最小化/简化问题,但事实证明文件名在这里很重要,并且是解决方案的关键。我已经以这种方式编辑了这个问题,以使这一点显而易见。我还添加了一个没有已知解释的答案,我希望其他人可以提供。

对于以下问题,我可以确认

  • /folder/custom_csv_parsing_functions.php存在,相关摘录如下所示
  • /c1/products.csv /c1/com1_webscrapersolution_new_email-10-02-20.csv 存在,可以查看全文here

我在 bash 中以 php -f file.php 运行 PHP。

file.php:

    <?php

    include('/folder/custom_csv_parsing_functions.php');

    $out = '/c1/com1_webscrapersolution_new_email-10-02-20.csv';


    //ENCLOSE HD DQUOTE

    $in = $out;

    $out = str_replace('.csv','_enc_hd.csv',$in);

    enclose_headers_dquote($in,$out);

抛出错误:

fopen('/c1/products.csvcom1_webscrapersolution_new_email-10-02-20.csv'): 无法打开流:中没有这样的文件或目录 /文件夹/custom_csv_parsing_functions.php 第 58 行

摘自/folder/custom_csv_parsing_functions.php

//removed code here as this is an excerpt

function enclose_headers_dquote($csv_input_file, $csv_output_file){

    $line = fgets(fopen($csv_input_file, 'r')); //this is line 58

    $line = str_replace("\r\n", '', $line);

    $arr = explode(',', $line);

    $header = '"' . implode('","', $arr) . '"';

    $header = array(
        $header
    );

    $fulltext = file_get_contents($csv_input_file);

    $fulltext = explode("\r\n", $fulltext);

    array_shift($fulltext);

    $reconstituted_csv_array = array_merge($header, $fulltext);
    $reconstituted_csv_str   = implode("\r\n", $reconstituted_csv_array);
    file_put_contents($csv_output_file, $reconstituted_csv_str);

}

如果文件 products.csvcom1_webscrapersolution_new_email-10-02-20.csv 存在,并且设置为 777 权限,为什么 PHP 报告“fopen('/c1/products. csvcom1_webscrapersolution_new_email-10-02-20.csv'):无法打开流:没有这样的文件或目录”?

此外,我可以确认直接在 bash 交互式 shell 中运行 PHP 确实成功:

[root@server c1]# php -a
Interactive shell

php > include('/folder/custom_csv_parsing_functions.php');
php > enclose_headers_dquote('/c1/com1_webscrapersolution_new_email-10-02-20.csv','/c1/com1_webscrapersolution_new_email-10-02-20_enc_hd.csv');

成功输出为/c1/com1_webscrapersolution_new_email-10-02-20_enc_hd.csv(可查看here)。

那么为什么在 bash 中以 php -f file.php 运行 PHP 时它不起作用?

【问题讨论】:

  • ('../c1/products.csv')
  • 我认为你在重复我多次犯的错误。请记住,/folder/custom_csv_parsing_functions.php./folder/custom_csv_parsing_functions.php 是两条完全不同的路径。换句话说,尝试在路径的开头添加一个点.
  • @PavelJanicek 但就我而言,/folder/custom_csv_parsing_functions.php 是绝对路径。这意味着folder 目录位于服务器根目录中,那么您的建议是否仍然适用?
  • @user136649 不是这种情况。我立即怀疑它不在文档根目录中,如前所述,我多次无法发现这一点,以至于我立即认为您被同样的错误所困扰
  • 还有第二件事。下面您从/c1 文件夹调用函数enclose_headers_dquote,但在您的示例中,您从/folder 文件夹中包含它。两个功能一样吗?如在,我假设根本原因仍然是一些难以在代码中找到拼写错误

标签: php bash error-handling fopen interactive-shell


【解决方案1】:

我不明白为什么,但这有效,我将不得不相应地编辑原始问题。

不幸的是,为了遵循最小示例,我将 csv 文件的实际名称从 com1_webscrapersolution_new_email-10-02-20.csv 重命名为 products.csv,以简化名称,认为这种差异没有任何意义。

当我重命名为 com1.csv 时,它起作用了。我假设它与名称中所有字符类型的复杂性以及解析方式等有关。

我不知道为什么这种差异会有所不同?我是否违反了 Linux 中的文件命名规则?破折号、数字和下划线在 Linux 文件名中都是合法的,不是吗?

我什至将名称显式传递为'\'c1/com1_webscrapersolution_new_email-10-02-20.csv\'',因此提供的参数值将显式括在单引号中。

【讨论】:

  • 在您上面的代码中,您几乎没有使用文件名“重命名”恶作剧。你有两种方法可以遵循。要么知道“它适用于products.csv,所以文件名必须是那个并且它有效,所以我没有碰它”,或者,你必须记住某处有一些愚蠢错字,因此您将代码拆分为尽可能多的行以查看它的实际位置。我目前的猜测是你在 hyphen- 和 dash 之间不匹配
  • 再补充一句:不要觉得这样做很愚蠢。如果我每犯一个错误都能得到一分钱,我可能会成为世界之王:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 2015-09-07
  • 2022-06-19
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
相关资源
最近更新 更多