fopen: не удалось открыть поток: нет такого файла или каталога - но файл / каталог существует - PullRequest
0 голосов
/ 13 февраля 2020

Редактировать: Первоначально я упростил исходный файл CSV (с com1_webscrapersolution_new_email-10-02-20.csv до products.csv), чтобы минимизировать / упростить вопрос, но оказалось, что имя файла имеет здесь значение и является ключом к решению. Я отредактировал вопрос таким образом, чтобы это стало очевидным. Я также добавил ответ без известного объяснения, которое, я надеюсь, кто-то другой может предоставить.

Для следующей проблемы я могу подтвердить, что

  • /folder/custom_csv_parsing_functions.php существует, соответствующая выдержка показана ниже
  • / c1 / products.csv /c1/com1_webscrapersolution_new_email-10-02-20.csv существует и может быть просмотрена полностью здесь

Я запускаю PHP в bash как 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.csv com1_webscrapersolution_new_email-10-02-20.csv'): не удалось открыть поток: нет такого файла или каталога в / folder / 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.csv com1_webscrapersolution_new_email-10-02- 20.csv существует и имеет 777 разрешений, почему PHP сообщает "fopen (' / c1 / products.csv com1_webscrapersolution_new_email-10-02-20.csv'): f ailed to open stream: Нет такого файла или каталога "?

Далее я могу подтвердить, что запуск PHP непосредственно в bash интерактивной оболочке действительно успешен:

[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 (можно посмотреть здесь ).

Так почему же он не работает при запуске PHP в bash как php -f file.php?

1 Ответ

0 голосов
/ 14 февраля 2020

Я не понимаю, почему, но это работает, и мне придется соответствующим образом отредактировать исходный вопрос.

К сожалению, пытаясь соответствовать минимальному примеру, я переименовал фактическое имя файла CSV из com1_webscrapersolution_new_email-10-02-20.csv до products.csv, чтобы упростить имя, думая, что это различие не имеет значения.

Когда я переименовал в com1.csv, это сработало. Я предполагаю, что это связано со сложностью всех типов символов в имени и тем, как оно анализируется, или чем-то подобным.

Я понятия не имею, почему это различие имеет значение? Нарушил ли я правила именования файлов в Linux? И тире, и цифры, и подчеркивания допустимы в Linux именах файлов, не так ли?

Я даже явно передал имя как '\'c1/com1_webscrapersolution_new_email-10-02-20.csv\'', поэтому предоставленное значение аргумента будет явно заключено в одинарные кавычки.

...