Почему появляется «no such file or directory» и как быстро исправить

Причина проста: либо указанный путь не существует (опечатка, регистр, неверная папка), либо у приложения/пользователя нет прав доступа. Проверьте путь, существование родительских папок, runtime‑разрешения и Scoped Storage — и чаще всего проблема исчезнет.

Проверка пути и имени файла

  1. Сначала убедитесь, что путь реально существует:
    • Откройте файловый менеджер или выполните ls в adb shell/Termux: ls /storage/emulated/0/Download.
    • Проверьте регистр букв: file.txt ≠ File.txt.
    • Уберите лишние пробелы, невидимые символы и обратные слэши (\ → /).
  2. Проверьте родительские папки:
    • Перед записью вызывайте file.getParentFile().mkdirs() или создавайте директорий вручную.
  3. Не полагайтесь на жёстко прописанные пути:
    • Не используйте /sdcard/ как универсальный путь; на разных устройствах есть /storage/emulated/0 или другие монтирования.
  4. Примеры быстрых исправлений:
    • cd /storage/emulated/0/Downloads вместо /storage/emulated/0/Download.
    • Если файл создаётся в internal storage, используйте context.getFilesDir() при обращении.

Проверьте путь сначала в проводнике/adb: если ls не выводит файл — путь неверный или файл удалён.

Права доступа, Scoped Storage и runtime‑разрешения

  1. Runtime‑права:
    • На Android 6+ запросите READ/WRITE_EXTERNAL_STORAGE (для старых версий) или соответствующие разрешения через диалоги.
    • Для пользователя: Настройки → Приложения → нужное приложение → Разрешения → «Файлы и медиа».
  2. Scoped Storage (Android 10+):
    • Приложения видят только свою песочницу и выбранные категории медиа.
    • Для доступа к произвольной папке используйте Storage Access Framework (ACTION_OPEN_DOCUMENT / ACTION_CREATE_DOCUMENT) или MediaStore для медиа.
  3. Рекомендации для разработчика:
    • Не хардкодьте общие пути; используйте getExternalFilesDir() или SAF.
    • Оборачивайте операции в try/catch и логируйте file.getAbsolutePath() при ошибке.

Не ожидайте, что предоставление прав сделает видимыми все папки: Scoped Storage ограничивает доступ даже при разрешениях.

Работа в adb/Termux, SD‑карта и системные каталоги

  1. adb/Termux:
    • Без root многие системные каталоги (/data, /system) недоступны — «no such file or directory» может означать отсутствие прав.
    • Убедитесь, что пакетное имя и путь совпадают: /data/data/com.example.app/... создаётся только после установки и первого запуска.
  2. SD‑карта и монтирование:
    • Если файлы «прыгают» или папки видны в одном приложении, но не в другом — проверьте, смонтирована ли SD‑карта и нет ли ошибок монтирования.
    • Извлеките карту, проверьте на ПК, восстановите или отформатируйте при необходимости (после резервного копирования).
  3. Когда нужен root:
    • Root нужен только для доступа в системные области; без него работайте в пределах /sdcard и директорий вашего приложения.
    • Не редактируйте /system и /data без полного понимания последствий — это может привести к потере загрузки устройства.

Частые ошибки

  • Опечатки в пути (Download vs Downloads).
  • Неправильный регистр символов.
  • Отсутствие родительской папки при записи.
  • Ожидание универсального /sdcard на всех устройствах.
  • Игнорирование Scoped Storage: приложение «не видит» файлы, хотя проводник их показывает.
  • Попытки доступа к /data или /system без root.

FAQ

  • Почему ls показывает файл, а приложение говорит «no such file»?
    • Приложение может работать в своей песочнице и не иметь прав на общий каталог; проверьте разрешения и Scoped Storage.
  • Что делать, если приложение внезапно перестало видеть файлы после обновления Android?
    • Проверьте новые правила хранения (Scoped Storage), обновите приложение, или используйте SAF/MediaStore.
  • Как быстро проверить, создаётся ли папка программно?
    • Логируйте file.getAbsolutePath() и результат file.getParentFile().exists() / mkdirs() перед записью.
  • Удалились файлы после очистки кэша — как восстановить?
    • Попробуйте восстановить из резервной копии; если файла не было в облаке, восстановление сложно.

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