Не удалось записать файл в указанный каталог

Обновлено: 03.07.2024

В PHP скриптах, вызывая include() , require() , fopen() или их производные, такие как include_once , require_once или даже move_uploaded_file() , часто появляются ошибки или предупреждения:

Не удалось открыть поток: нет такого файла или каталога.

Как быстро найти первопричину проблемы?

Ответ 1

Есть много причин, по которым можно столкнуться с этой ошибкой, и поэтому я дам контрольный список того, что необходимо проверить в первую очередь для решения этой ситуации.

Предположим, у нас есть следующая строка:

require "/path/to/file"

Контрольный список

1. Проверьте путь к файлу на предмет опечаток

  • проверьте вручную (визуально проверив путь) ;

  • переместите все, что вызывается с помощью require* или include* в переменную, скопируйте ее и попробуйте получить к ней доступ с терминала:

2. Убедитесь, что путь к файлу правильный с точки зрения относительного и абсолютного пути

  • если он начинается с косой черты "/", то это относится не к корню папки вашего веб-сайта (корень документа), а к корню вашего сервер :

    • например, каталог вашего веб-сайта может быть /users/tony/htdocs ;

    • не относительно пути к корню вашего веб-сайта или файла ;

    • или всегда используйте абсолютные пути к файлам .

    1. используйте require __DIR__."/relative/path/from/current/file" , который возвращает каталог текущего файла ;

    2. определите SITE_ROOT константу самостоятельно:

      • в корне каталога вашего веб-сайта создайте файл, например , config.php

      • в config.php напишите :

    • в каждом файле, в котором вы хотите сослаться на корневую папку сайта, включите config.php и затем используйте SITE_ROOT константу везде, где хотите:

    3. Проверьте свои пути включения

    Другой способ включения файлов, ни относительный, ни абсолютный, - это полагаться на путь включения . Это часто бывает с библиотеками или фреймворками, такими как, например, Zend framework.

    Подобное включение будет выглядеть так:

    include "Zend/Mail/Protocol/Imap.php"

    В этом случае вы должны убедиться, что папка, в которой находится «Zend», является частью пути включения.

    Это можно проверить с помощью:

    echo get_include_path();

    Вы можете добавить в него папку с помощью:

    set_include_path(get_include_path().":"."/path/to/new/folder");

    4. Убедитесь, что у вашего сервера есть доступ к этому файлу

    Может случиться так, что у пользователя, запускающего серверный процесс (Apache или PHP), просто нет разрешения на чтение или запись в этот файл.

    Чтобы проверить, под каким пользователем запущен сервер, можно использовать posix_getpwuid :

    $user = posix_getpwuid(posix_geteuid());

    var_dump($user);

    Чтобы узнать права доступа к файлу, введите в терминале следующую команду:

    ls -l <path/to/file>

    5. Проверьте настройки PHP

      • Если установлено, PHP не сможет получить доступ к любому файлу за пределами указанного каталога (даже через символическую ссылку).

      • По умолчанию не устанавливается, и в этом случае ограничений нет.

      • Можно проверить, вызвав phpinfo() или используя ini_get("open_basedir") .

      • Вы можете изменить настройку, отредактировав файл php.ini или файл httpd.conf.

      • Е сли включено, могут быть ограничения. Однако данный режим был удален в PHP 5.4. Если вы все еще используете версию, которая поддерживает безопасный режим, обновитесь до версии PHP, которая это еще поддерживает .

      • О тносится только к включению или открытию файлов через сетевой процесс, такой как http://, но не работает для локальной файловой системы.

      • Э ти опции можно проверить, используя ini_get("allow_url_include") или установи в с помощью ini_set("allow_url_include", "1") .

    Другие случаи

    Если ничего из вышеперечисленного не помогло диагностировать проблему, могут возникнуть следующие особые ситуации:

    1. Включение библиотеки на основе пути включения

    Может случиться так, что вы подключаете библиотеку, например, платформу Zend, используя относительный или абсолютный путь. Например:

    require "/usr/share/php/libzend-framework-php/Zend/Mail/Protocol/Imap.php"

    Но по-прежнему получаете такую же ошибку.

    Это могло произойти из-за того, что файл, который вы (успешно) включили, сам имеет оператор include для другого файла, и этот второй оператор include предполагает, что вы добавили путь этой библиотеки к пути включения.

    Например, упомянутый ранее файл фреймворка Zend может включать следующее:

    include "Zend/Mail/Protocol/Exception.php"

    что не является включением ни по относительному пути, ни по абсолютному пути. Предполагается, что каталог фреймворка Zend был добавлен в путь включения.

    В таком случае единственное практическое решение - добавить каталог в ваш путь включения.

    2. SELinux

    3. Symfony

    Если вы используете Symfony и получаете эту ошибку при загрузке на сервер, возможно, к э ш приложения не был сброшен, либо потому, что app/cache был загружен, либо этот к э ш не был очищен.

    Для этого надо выполнить следующую консольную команду:

    cache:clear

    4. Внутри Zip-файла символы, отличные от A SC II

    По-видимому, эта ошибка может произойти также при вызове zip->close(), когда некоторые файлы внутри zip имеют в своем имени не-ASCII символы, такие как, например, «é».

    Потенциальное решение - обернуть имя файла, используя utf8_decode(), перед созданием целевого файла.

    Ответ 2

    В дополнение к предыдущему ответу:

    Программное обеспечение для виртуального хостинга

    Права доступа к файлам

    1. Этот пользователь владеет файлом и, возможно, родительским каталогом (особенно родительским каталогом, если вы хотите записывать файлы). В большинстве сред общего хостинга это не будет проблемой, потому что ваш пользователь должен владеть всеми файлами под вашим корневым каталогом.

    2. В Linux хорошей практикой будет использова ние chmod 600 (только владелец может читать и писать) или chmod 644 (владелец может писать, но все могут читать) .

    Ответ 3

    Samba Shares

    Если у вас есть тестовый сервер Linux и вы работаете из клиента Windows, общий ресурс Samba мешает команде chmod . Даже если вы используете:

    chmod -R 777 myfolder

    со стороны Linux вполне возможно, что Unix Group\www-data все еще не будет иметь доступ на запись. Есть рабочее решение : если ваш общий ресурс настроен так, что администраторы Windows сопоставлены с корневым каталогом – в Windows откройте разрешения, отключите наследование для вашей папки с копией, а затем предоставьте полный доступ для www-данных.

    Мы будем очень благодарны

    если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

    В этой статье мы будем использовать следующие способы для устанения ошибки "Ошибка записи в файл":

    • Способ 1: Запуск инсталлятора с правами администратора
    • Способ 2: Устранение проблем с совместимостью
    • Способ 3: Установка разрешений на запись
    • Способ 4: Отключение UAC
    • Способ 5: Отключение антивируса
    • Способ 6: Проверка состояния жесткого диска

    1. Запуск инсталлятора с правами администратора

    Наиболее часто рассматриваемая ошибка возникает, когда установочный файл не может получить доступ к определённому месту для записи данных, например, при инсталляции софта на системный диск. В такой ситуации должно помочь открытие исполняемого файла с правами админа: кликните по нему правой кнопкой мыши, затем выберите параметр «Запуск от имени администратора».


    2. Устранение проблем с совместимостью

    Нередко причина появления ошибки заключается в проблемах с совместимостью: например, установочный файл, предназначенный, скажем, для Windows XP, запускается на Windows 10 последних редакций. В такой ситуации стоит воспользоваться встроенным в ОС средством устранения неполадок совместимости.

    1. Кликните ПКМ по инсталлятору и выберите пункт «Свойства».
    2. Перейдите на вкладку «Совместимость» и воспользуйтесь ссылкой «Запустить средство устранения проблем с совместимостью».
    3. Подождите, пока инструмент подберёт настройки, после чего нажмите «Использовать рекомендованные параметры».

    Попробуйте снова установить приложение, на этот раз рассматриваемая проблема больше не появится.

    3. Установка разрешений на запись

    Если предыдущие методы не помогли устранить ошибку, возможно, дело в разрешениях на изменение содержимого целевого каталога. Рекомендуется проверить существующие параметры и изменить их в случае необходимости, в чём вам поможет этая инструкция.

    4. Отключение UAC

    Иногда причиной ошибки может быть система контроля учётных записей Windows (UAC): из-за бага или сбоев в настройках безопасности инсталлятору запрещено изменение файловой системы. Для решения этой проблемы можно временно отключить UAC, установить желаемый софт и активировать контроль аккаунтов обратно. На нашем сайте уже есть инструкции по проведению этой процедуры, ознакомьтесь с ними.


    5. Отключение антивируса

    Нельзя исключать и вмешательство защитного ПО: нередко некоторые устаревшие компоненты инсталляторов помечены в их алгоритмах как небезопасные, антивирус блокирует их, вследствие чего и возникает ошибка записи в файл. Для проверки можно приостановить защиту и выполнить запуск проблемного инсталлятора. Но стоит иметь в виду, что такое решение небезопасно, и пользоваться им лучше лишь в случае крайней необходимости.

    6. Проверка состояния жесткого диска

    Самой редкой, но и самой неприятной причиной рассматриваемой проблемы являются сбои в работе жесткого диска: не исключено, что в нём присутствуют плохие и/или нестабильные секторы, запись в которые невозможна, о чём и сигнализирует система. Поэтому если ни один из вышеприведённых способов не принёс должного эффекта, следует проверить накопитель. Как проверить SSD и M2 жесткие диски на ошибки, а так же обычные диски читаем здесь и здесь.

    1С:Предприятие 8.3 – это довольно сложная система, поддерживающая множество инструментов и механизмов. Одним из этих механизмов является работа с каталогами (папками).

    Работа с каталогами необходима для хранения временных файлов, импорта и экспорта данных. Если вдруг посреди рабочего дня пользователю необходимо выгрузить какую-то информацию из базы, но система «ругается», мол, каталог не обнаружен, это может стать серьезным стоп-фактором и даже полностью остановить какой-либо бизнес-процесс, что обязательно приведет к убыткам компании. Соответственно, доступ к каталогам всегда должен предоставляться без каких-либо ограничений.

    Наиболее частая причина возникновения этой ошибки программы 1С – неверно указанный путь к папке или файлу.

    2. У пользователя недостаточно прав доступа

    Чуть реже ошибка доступа к каталогу встречается, когда у пользователя недостаточно прав доступа к тому или иному каталогу.

    Представим ситуацию: пользователь подключился при помощи RDP к удаленной базе, и решил сохранить документ сразу на свой компьютер.

    Если при интернет подключении к удаленному рабочему столу пользователь не расшарил (не дал доступ) свои локальные ресурсы, то на сервере они будут не доступны, и возможности сохранить данные на них не будет. Соответственно при попытке указать путь к локальному каталогу, система будет выдавать ошибку «Каталог не обнаружен».

    Для решения данной ошибки в 1С:Предприятие, версии 8, будет достаточно указать, какой диск должен быть доступен на удаленном рабочем столе во время работы.

    Подключение локального диска к удаленному рабочему столу

    Подключение локального диска к удаленному рабочему столу

    А если каталог доступен, но данная ошибка все равно появляется, стоит проверить права доступа к каталогу. Если для текущего пользователя отсутствуют права на чтение или запись, то необходимо их добавить.

    Описание ошибки:
    Обнаружена при разработке обработки для изменения содержимого файла формата XML в серверной базе 1С 8 в режиме управляемого приложения. При тестировании на сервере ошибка не возникала. Проявила себя при работе на рабочем месте пользователя.

    1С 8 ошибка файл не обнаружен при чтении файла

    По факту ошибка возникала при выполнении метода "Прочитать()" для объекта "ТекстовыйДокумент". Как было отмечено, при тестировании работы обработки непосредственно на сервере данной ошибки не возникало. Она проявила себя уже при попытке работы на другом рабочем месте. Обработка разрабатывалась для конфигурации 1С: Комплексная автоматизация 8, ред. 2, которая работает в режиме управляемого приложения - это необходимо отметить. Т.к. это проясняет причины возникновения проблемы.

    По привычке разместил операции по чтению содержимого текстового файла и извлечению его содержимого на стороне сервера - см. "&НаСервере" перед процедурой "ОбрабткаНаСервере()". Клиент-серверная архитектура платформы 1С: Предприятие 8.3, казалось бы, к этому обязывала.

    1с 8.3 при чтении файла пишет, выводит ошибку: Файл не обнаружен

    В итоге получалось, что платформа на клиентском рабочем месте искала файл по указанному пути на сервере, где развернут сервер 1С: Предприятия 8 исходя из директивы "&НаСервере", а не на рабочем компьютере, где была запущена обработка.

    Но, как оказалось позже - конструктор "Новый ТекстовыйДокумент", методы "Прочитать()", "ПолучитьТекст()" - все они доступны не только на стороне сервера, но и на стороне тонкого и толстого клиента. Поэтому замена директивы "&НаСервере" на "&НаКлиенте" решила проблему.

    Читайте также: