Почему появляется «no such file or directory» и как быстро исправить
Причина проста: либо указанный путь не существует (опечатка, регистр, неверная папка), либо у приложения/пользователя нет прав доступа. Проверьте путь, существование родительских папок, runtime‑разрешения и Scoped Storage — и чаще всего проблема исчезнет.
Проверка пути и имени файла
- Сначала убедитесь, что путь реально существует:
- Откройте файловый менеджер или выполните ls в adb shell/Termux: ls /storage/emulated/0/Download.
- Проверьте регистр букв: file.txt ≠ File.txt.
- Уберите лишние пробелы, невидимые символы и обратные слэши (\ → /).
- Проверьте родительские папки:
- Перед записью вызывайте file.getParentFile().mkdirs() или создавайте директорий вручную.
- Не полагайтесь на жёстко прописанные пути:
- Не используйте /sdcard/ как универсальный путь; на разных устройствах есть /storage/emulated/0 или другие монтирования.
- Примеры быстрых исправлений:
- cd /storage/emulated/0/Downloads вместо /storage/emulated/0/Download.
- Если файл создаётся в internal storage, используйте context.getFilesDir() при обращении.
Проверьте путь сначала в проводнике/adb: если ls не выводит файл — путь неверный или файл удалён.
Права доступа, Scoped Storage и runtime‑разрешения
- Runtime‑права:
- На Android 6+ запросите READ/WRITE_EXTERNAL_STORAGE (для старых версий) или соответствующие разрешения через диалоги.
- Для пользователя: Настройки → Приложения → нужное приложение → Разрешения → «Файлы и медиа».
- Scoped Storage (Android 10+):
- Приложения видят только свою песочницу и выбранные категории медиа.
- Для доступа к произвольной папке используйте Storage Access Framework (ACTION_OPEN_DOCUMENT / ACTION_CREATE_DOCUMENT) или MediaStore для медиа.
- Рекомендации для разработчика:
- Не хардкодьте общие пути; используйте getExternalFilesDir() или SAF.
- Оборачивайте операции в try/catch и логируйте file.getAbsolutePath() при ошибке.
Не ожидайте, что предоставление прав сделает видимыми все папки: Scoped Storage ограничивает доступ даже при разрешениях.
Работа в adb/Termux, SD‑карта и системные каталоги
- adb/Termux:
- Без root многие системные каталоги (/data, /system) недоступны — «no such file or directory» может означать отсутствие прав.
- Убедитесь, что пакетное имя и путь совпадают: /data/data/com.example.app/... создаётся только после установки и первого запуска.
- SD‑карта и монтирование:
- Если файлы «прыгают» или папки видны в одном приложении, но не в другом — проверьте, смонтирована ли SD‑карта и нет ли ошибок монтирования.
- Извлеките карту, проверьте на ПК, восстановите или отформатируйте при необходимости (после резервного копирования).
- Когда нужен 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.