fopen:无法打开流:没有这样的文件或目录 - 但 file/directory 存在
fopen: failed to open stream: No such file or directory - but file/directory exists
编辑:原来我把原来的csv文件(从com1_webscrapersolution_new_email-10-02-20.csv
到products.csv
)简化成了minimise/simplify这个问题,结果发现文件名是这里的后果是解决方案的关键。我以这种方式编辑了这个问题,使这一点显而易见。我还添加了一个没有已知解释的答案,我希望其他人可以提供。
对于以下问题,我可以确认
/folder/custom_csv_parsing_functions.php
存在,相关摘录如下
/c1/products.csv /c1/com1_webscrapersolution_new_email-10-02-20.csv 存在并且可以完整查看 here
我是运行bash中的PHP和php -f file.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'):
failed to open stream: No such file or directory in
/folder/custom_csv_parsing_functions.php
on line 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'): failed to open stream: No such file or directory"?
此外,我可以确认 运行 PHP 直接在 bash 交互 shell 中确实成功了:
[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 为 php -f file.php
时它不起作用?
我不明白为什么,但这行得通,我将不得不相应地编辑原始问题。
不幸的是,为了符合最小示例,我将 csv 文件的实际名称从 com1_webscrapersolution_new_email-10-02-20.csv
重命名为 products.csv
以简化名称,认为这种差异无关紧要。
当我重命名为 com1.csv
时,它起作用了。我假设它与名称中所有字符类型的复杂性及其解析方式等有关。
我不知道为什么这种差异会产生影响?我是否违反了 Linux 中的文件命名规则? Linux 文件名中的破折号、数字和下划线都是合法的,不是吗?
我什至明确将名称作为 '\'c1/com1_webscrapersolution_new_email-10-02-20.csv\''
传递,因此提供的参数值将明确用单引号引起来。
编辑:原来我把原来的csv文件(从com1_webscrapersolution_new_email-10-02-20.csv
到products.csv
)简化成了minimise/simplify这个问题,结果发现文件名是这里的后果是解决方案的关键。我以这种方式编辑了这个问题,使这一点显而易见。我还添加了一个没有已知解释的答案,我希望其他人可以提供。
对于以下问题,我可以确认
/folder/custom_csv_parsing_functions.php
存在,相关摘录如下/c1/products.csv/c1/com1_webscrapersolution_new_email-10-02-20.csv 存在并且可以完整查看 here
我是运行bash中的PHP和php -f file.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'): failed to open stream: No such file or directory in /folder/custom_csv_parsing_functions.php on line 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'): failed to open stream: No such file or directory"?
此外,我可以确认 运行 PHP 直接在 bash 交互 shell 中确实成功了:
[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 为 php -f file.php
时它不起作用?
我不明白为什么,但这行得通,我将不得不相应地编辑原始问题。
不幸的是,为了符合最小示例,我将 csv 文件的实际名称从 com1_webscrapersolution_new_email-10-02-20.csv
重命名为 products.csv
以简化名称,认为这种差异无关紧要。
当我重命名为 com1.csv
时,它起作用了。我假设它与名称中所有字符类型的复杂性及其解析方式等有关。
我不知道为什么这种差异会产生影响?我是否违反了 Linux 中的文件命名规则? Linux 文件名中的破折号、数字和下划线都是合法的,不是吗?
我什至明确将名称作为 '\'c1/com1_webscrapersolution_new_email-10-02-20.csv\''
传递,因此提供的参数值将明确用单引号引起来。