Для скачивания требуется доступ к хранилищу. Как сделать собственное облачное хранилище. Сохранение файлов во внутреннем хранилище

Хранилище конфигурации в 1С 8.2 и 8.3 — это инструмент для групповой разработки решения, встроенный в платформу 1С: Предприятие 8. Хранилище позволяет вести многопользовательскую разработку решений неограниченным количеством пользователей. С его помощью можно увидеть полную историю разработки конфигурации и каждый шаг разработчиков в подробностях.

Рассмотрим настройки и работу с хранилищем конфигурации подробнее.

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

Так же в этой БД хранится информации о том, кем захвачен тот и или иной объект. Захват объекта — это метка, устанавливаемая разработчиком. Установленный захват позволяет избежать коллизий при групповой разработке. Пока объект захвачен, никто не может его редактировать.

Захватить можно как объект целиком (рекурсивно), так и отдельно объект или формы.

После того как разработчик произвел какие-то действия над объектом, он обязан поместить доработки в хранилище. И тем самым снять пометку о том, что объект захвачен.

Как создать хранилище 1С

Создать хранилище достаточно просто, для этого необходимо выбрать в меню «Конфигурация — Хранилище конфигурации» пункт «Создать хранилище». В появившемся меню достаточно указать путь к будущему расположению хранилища и логин/пароль пользователя-администратора:

При создании сделайте обязательно резервную учетную запись с административными правами — очень часто это выручает.

Как подключиться к хранилищу 1С

Чтобы подключиться к хранилищу конфигурации, нужно выбрать в меню в меню «Конфигурация — Хранилище конфигурации» пункт «Подключиться к хранилищу». В появившемся окне необходимо указать путь к хранилищу и логин/пароль пользователя, нажать «Подключиться»:

Получите 267 видеоуроков по 1С бесплатно:

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

Администрирование хранилища конфигурации 1С

Для администрирования хранилища 1С необходимо выбрать в меню конфигурации следующий пункт — «Конфигурация — Хранилище конфигурации — Администрирование»:

  • На вкладке «Пользователи» можно добавить или удалить новых пользователей, а также определить состав прав для каждого из них.
  • На вкладке «Подключения» можно просмотреть всех пользователей, подключившихся к хранилищу, по необходимости отключить их.
  • На вкладке «Отмена захвата» Вы можете снять захват любого пользователя на определенный объект, если конечно же Вы имеете права на это.
Как просмотреть историю хранилища 1С

Для просмотра истории надо зайти в меню «Конфигурация — Хранилище конфигурации», выбрать пункт «История хранилища»:

В истории хранилища 1С можно увидеть, когда, кем и что было изменено.

Разработка с хранилищем 1С 8.3

Работу с хранилищем условно можно разделить на основные действия:

  • конфигурации из хранилища конфигурации 1С;
  • обновить статусы хранилища 1С;
  • захват в хранилище;
  • помещение в хранилище.

Остановимся подробнее на каждом действии:

Обновить статусы хранилища 1С

Производит получение последних статусов объектов (захвачен или нет).

Вызывается: «Конфигурация — Хранилище конфигурации — Обновить статусы».

Обновление конфигурации из хранилища конфигурации 1С

Действие позволит получить все измененные объекты конфигурации, которые были помещены в хранилище. Выполнение данной команды так же обновляет статусы объектов.

Вызывается: «Конфигурация — Хранилище конфигурации — Обновить конфигурацию из хранилища».

Захват в хранилище конфигурации 1С

С помощью этой команды можно заблокировать изменение данного объекта для других разработчиков: пока объект захвачен Вами, никакой пользователь не может изменить его до тех пор, пока Вы не поместите объект обратно.

Произвести захват можно, вызвав правой кнопкой контекстное меню у объекта метаданных:

В открывшемся окне можно установить некоторые настройки:

  • Выполнять рекурсивно — позволяет захватить все подчиненные объекты — формы и т.д.
  • Разрешать получать захваченные — позволяет получать другим пользователям промежуточные версии объекта

Помещение в хранилище 1С

После изменения объекта его необходимо поместить обратно в хранилище, делается это так же, как захват, только выбирается пункт «Поместить в хранилище»:

При помещении обязательно заполняйте поле «комментарий», это очень важно при групповой разработке. Через полгода Вы и не вспомните, зачем производили те или иные действия. Так же, как у захвата, у помещения есть свои специфичные настройки:

  • Выполнять рекурсивно — позволяет поместить все подчиненные объекты — формы и т.д.
  • Оставить захваченными — позволяет поместить «промежуточную» версию объекта, оставив при этом захват пользователем
Как добавить новый объект в хранилище 1С

Android uses a file system that"s similar to disk-based file systems on other platforms. This page describes how to work with the Android file system to read and write files with the APIs.

Choose internal or external storage

All Android devices have two file storage areas: "internal" and "external" storage. These names come from the early days of Android, when most devices offered built-in non-volatile memory (internal storage), plus a removable storage medium such as a micro SD card (external storage). Many devices now divide the permanent storage space into separate "internal" and "external" partitions. So even without a removable storage medium, these two storage spaces always exist, and the API behavior is the same regardless of whether the external storage is removable.

Because the external storage might be removable, there are some differences between these two options as follows.

Tip: Although apps are installed onto the internal storage by default, you can allow your app to be installed on external storage by specifying the attribute in your manifest. Users appreciate this option when the APK size is very large and they have an external storage space that"s larger than the internal storage. For more information, see .

Save a file on internal storage

Your app"s internal storage directory is specified by your app"s package name in a special location of the Android file system that can be accessed with the following APIs.

On Android 6.0 (API level 23) and lower, other apps can read your internal files if you set the file mode to be world readable. However, the other app must know your app package name and file names. Other apps cannot browse your internal directories and do not have read or write access unless you explicitly set the files to be readable or writable. So as long as you use for your files on the internal storage, they are never accessible to other apps.

Write a cache file

If you instead need to cache some files, you should use . For example, the following method extracts the file name from a and creates a file with that name in your app"s internal cache directory:

Kotlin private fun getTempFile(context: Context, url: String): File? = Uri.parse(url)?.lastPathSegment?.let { filename -> File.createTempFile(filename, null, context.cacheDir) } Java private File getTempFile(Context context, String url) { File file; try { String fileName = Uri.parse(url).getLastPathSegment(); file = File.createTempFile(fileName, null, context.getCacheDir()); } catch (IOException e) { // Error while creating file } return file; }

Tip: If you need to package a file in your app that is accessible at install time, save the file in your project"s res/raw/ directory. You can open these files with , passing the R.raw. filename resource ID. This method returns an that you can use to read the file. You cannot write to the original file.

Open a directory

You can open a directory on the internal file system with the following methods:

Returns a representing the directory on the file system that"s uniquely associated with your app. Creates a new directory (or opens an existing directory) within your app"s unique file system directory. This new directory appears inside the directory provided by . Returns a representing the cache directory on the file system that"s uniquely associated with your app. This directory is meant for temporary files, and it should be cleaned up regularly. The system may delete files there if it runs low on disk space, so make sure you check for the existence of your cache files before reading them.

To create a new file in one of these directories, you can use the constructor, passing the object provided by one of the above methods that specifies your internal storage directory. For example:

Kotlin val directory = context.filesDir val file = File(directory, filename) Java File directory = context.getFilesDir(); File file = new File(directory, filename); Save a file on external storage

Using the external storage is great for files that you want to share with other apps or allow the user to access with a computer.

Request external storage permissions

To write to the public external storage, you must request the permission in your :

... ...

Beginning with Android 4.4 (API level 19), reading or writing files in your app"s private external storage directory-accessed using -does not require the or permissions. So if your app supports Android 4.3 (API level 18) and lower, and you want to access only the private external storage directory, you should declare that the permission be requested only on the lower versions of Android by adding the attribute:

...

Verify that external storage is available

Because the external storage might be unavailable—such as when the user has mounted the storage to a PC or has removed the SD card that provides the external storage—you should always verify that the volume is available before accessing it. You can query the external storage state by calling . If the returned state is , then you can read and write your files. If it"s , you can only read the files.

For example, the following methods are useful to determine the storage availability:

Kotlin /* Checks if external storage is available for read and write */ fun isExternalStorageWritable(): Boolean { return Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED } /* Checks if external storage is available to at least read */ fun isExternalStorageReadable(): Boolean { return Environment.getExternalStorageState() in setOf(Environment.MEDIA_MOUNTED, Environment.MEDIA_MOUNTED_READ_ONLY) } Java /* Checks if external storage is available for read and write */ public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; } /* Checks if external storage is available to at least read */ public boolean isExternalStorageReadable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return true; } return false; } Save to a public directory

If you want to save public files on the external storage, use the method to get a representing the appropriate directory on the external storage. The method takes an argument specifying the type of file you want to save so that they can be logically organized with other public files, such as or . For example:

Kotlin fun getPublicAlbumStorageDir(albumName: String): File? { // Get the directory for the user"s public pictures directory. val file = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), albumName) if (!file?.mkdirs()) { Log.e(LOG_TAG, "Directory not created") } return file } Java public File getPublicAlbumStorageDir(String albumName) { // Get the directory for the user"s public pictures directory. File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file; }

If you want to hide your files from the Media Scanner, include an empty file named .nomedia in your external files directory (note the dot prefix in the filename). This prevents media scanner from reading your media files and providing them to other apps through the content provider.

Save to a private directory

If you want to save files on external storage that are private to your app and not accessible by the content provider, you can acquire a directory that"s used by only your app by calling and passing it a name indicating the type of directory you"d like. Each directory created this way is added to a parent directory that encapsulates all your app"s external storage files, which the system deletes when the user uninstalls your app.

Caution: Files on external storage are not always accessible , because users can mount the external storage to a computer for use as a storage device. So if you need to store files that are critical to your app"s functionality, you should instead store them on .

For example, here"s a method you can use to create a directory for an individual photo album:

Kotlin fun getPrivateAlbumStorageDir(context: Context, albumName: String): File? { // Get the directory for the app"s private pictures directory. val file = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), albumName) if (!file?.mkdirs()) { Log.e(LOG_TAG, "Directory not created") } return file } Java public File getPrivateAlbumStorageDir(Context context, String albumName) { // Get the directory for the app"s private pictures directory. File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file; }

If none of the pre-defined sub-directory names suit your files, you can instead call and pass null . This returns the root directory for your app"s private directory on the external storage.

Kotlin myFile.delete() Java myFile.delete();

If the file is saved on internal storage, you can also ask the to locate and delete a file by calling :

Kotlin myContext.deleteFile(fileName) Java myContext.deleteFile(fileName);

Note: When the user uninstalls your app, the Android system deletes the following:

  • All files you saved on internal storage.
  • All files you saved external storage using .

However, you should manually delete all cached files created with on a regular basis and also regularly delete other files you no longer need.

Facebook Google Plus Запрет доступа или проблема с разрешением на доступ к файлу/папке на внешнем диске

Иногда при подключении внешнего диска к компьютеру с ОС Windows 2000 Pro, XP или Vista приходится присваивать разрешения/привилегии. Поскольку файлы принадлежат другой учетной записи, при попытке открыть диск или папку на нем может появиться ошибка "Доступ запрещен" или "Недоступно".

Сведения о передаче права собственности текущему пользователю в XP Professional см. ниже. Эти инструкции относятся и к Windows Vista .
( XP Home .)

Чтобы передать права владения текущему пользователю в Windows XP HOME :

  • Загрузитесь в безопасном режиме.
  • Щелкните правой кнопкой мыши нужный файл/папку и откройте раздел Properties (Свойства).
  • Последовательно щелкните Security (Безопасность) > Advanced (Дополнительно) > Owner (Владелец) и выделите учетную запись пользователя на компьютере, который должен стать владельцем этих файлов и папок.
    Установите флажок "Replace owner on subcontainers and folders (Заменить владельца подконтейнеров и объектов)", чтобы все файлы в папке могли наследовать изменения (только при изменении разрешений папки).
  • При появлении сообщения "Вы не имеете разрешения на чтение содержимого папки [имя папки ]. Хотите заменить разрешения для этой папки так, чтобы иметь права полного доступа? Все разрешения будут заменены, если нажать кнопку "Да"" нажмите кнопку Да .
  • См. следующие статьи центра поддержки Microsoft:

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

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

    Наконец, возможно повреждение файловой структуры.

    • Запустите проверку диска , чтобы попытаться устранить повреждение.
    • При повреждении раздела выполните описанные выше действия.

    УКАЗАНИЕ СТОРОННИХ РАЗРАБОТЧИКОВ И ВЕБ-САЙТОВ. Компания Seagate указывает сторонних разработчиков и сторонние продукты исключительно в информативных целях, не отдавая предпочтения и не давая рекомендаций (прямо или косвенно) ни одной из упоминаемых компаний. Компания Seagate не дает никаких гарантий (включая косвенные и любые иные) в отношении производительности и надежности таких компаний и продуктов. Компания Seagate не связана ни с одной из упоминаемых компаний и не контролирует их работу, поэтому не берет на себя никакой ответственности в связи с ними и отказывается от любых обязательств в отношении действий или продукции упоминаемых компаний. Прежде чем вести дела с какой-либо компанией, проведите собственную независимую оценку. За техническими характеристиками и информацией о гарантии обращайтесь напрямую к соответствующему производителю. В данном документе приводятся ссылки на веб-сайты сторонних компаний, которые Seagate не контролирует. Такие ссылки приводятся для удобства и используются на собственный риск пользователя. Компания Seagate не дает никаких гарантий в отношении материалов, представленных на таких веб-сайтах, не подтверждает их и не берет на себя никакой ответственности за них или за пользование упомянутыми веб-сайтами.

    Предположим, что у вас на компьютере хранятся файлы и папки, к которым хорошо бы иметь доступ всегда и везде, т.е. – открыть и посмотреть, а также иметь возможность скачать и отредактировать их с любого устройства (планшет, смартфон, другой компьютер) и из любой точки, где вы можете выйти в интернет.
    Всё это очень удобно когда вы регулярно обращаетесь к каким-то заметкам, таблицам, текстам. Находитесь вы, например, в дороге или в любом месте, где не можете сесть за свой компьютер. А доступ к некоторым файлам вам нужен прямо сейчас чтобы просто посмотреть какую-то информацию или возможно внести срочно небольшие изменения, пока вы про это не забыли. В таких случаях вы сможете всегда иметь доступ к нужным вам файлам если загрузите их на специальные бесплатные онлайн-хранилища (диски). Основные из них: Яндекс-Диск, Облако Mail, Google-Диск, Microsoft OneDrive и Mega. Файлы будут храниться в интернете в защищённом пространстве под вашим паролем, и открыть их можно с любого устройства и из любой точки при помощи бесплатных приложений! Нужна лишь возможность выхода в интернет. Да, и ещё один важный момент. Хранение файлов в онлайн-хранилищах защитит вас от потери данных, в случае если с вашим компьютером что-то случится.

    К примеру – сломался жёсткий диск, украли и так далее. Ведь все важные данные будут храниться одновременно в защищённых хранилищах в интернете, откуда вы сможете их беспрепятственно восстановить.

    В предыдущей статье я рассказывал о полноценном удалённом доступе к компьютеру с любого другого устройства и возможно кто-то подумает: «А почему бы не воспользоваться тогда просто удалённым доступом?». В таком случае данный вариант не эффективен и гораздо менее удобен по следующим причинам:

      Во-первых, ваш компьютер, к которому вы хотите подключиться должен быть всегда включён, либо иметь возможность включения по сети;

      Во-вторых, нам ведь нужно всего лишь посмотреть / отредактировать несколько файлов, а не иметь доступ ко сразу ко всем программам на компьютере.

      В третьих, полный удалённый доступ к компьютеру с нужными вам данными будет потреблять больше интернет-трафика и требовать достаточно высокой скорости Интернет-соединения.

    Удалённый доступ к компьютеру нужен не для таких целей, а тогда, когда вам может понадобиться вход в какую-то программу на компьютере, произвести какие-то настройки.

    По сравнению с удалённым доступом, для работы с файлами в онлайн-хранилищах вам понадобится пройти лишь несколько простых шагов:

    Зарегистрироваться в нужных онлайн-хранилищах (лучше во всех основных), ведь это бесплатно!

    Загрузить туда необходимые файлы, к которым вы хотели бы иметь доступ всегда и везде;

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

    Но не всё же так идеально... Есть, конечно же, одно важное ограничение. Заключается оно в максимальном объёме хранимой информации на каждом из онлайн-дисков. Оно, понятное дело, не бесконечное и, как правило, рассчитано на хранение самых основных данных. Если нужно больше – нужно платить за дополнительное свободное место, либо воспользоваться различными акциями или реферальной программой, если таковые вообще имеются в нужном сервисе.

    Рассмотрим основные сервисы для удалённого хранения файлов и сравним их

    Яндекс-Диск .
    Объём диска, доступный по умолчанию при бесплатной регистрации – 10 Гб. Также возможно получить 10 Гб за приглашение друзей (реферальная программа): 512 Мб за каждого приглашённого.
    Также возможно получить дополнительное место по текущим акциям, например – 50 Гб тем, кто купит смартфон / планшет / ноутбук определённой модели. За акциями нужно следить, поскольку одни заканчиваются, другие начинаются:)

    Ну и последний вариант расширения дискового пространства на Яндексе – это покупка нужного объёма.

    Вот возможные варианты расширения свободного места на Яндекс-Диске:

    Для сравнения цен на покупку дополнительного свободного места, возьмём объём, равный 1 терабайту (1 Тб = 1024 Гб).

    Цена 1 Тб на Яндексе, как видим из изображения выше, равна 900 рублей в месяц.

    Яндекс-Диск

    Google-Диск .
    Объём диска по умолчанию – 15 Гб. Расширение объёма за счёт различных акций и партнёрской программы не предусмотрено.
    Расширить диск возможно только заплатив за месяц или год, выбрав нужный объём.

    Вот какие условия нам предлагает Google-Диск:

    Цена за 1 Тб равна 9.99$. Если переведём в рубли (возьмём курс доллара на 15.10.2014 = 40.5 рублей), то видим сразу что на Google цена значительно выгоднее, чем на Яндексе. 9.99 x 40.5 = примерно 404.6 рублей, вместо 900 руб.

    Google-Диск

    Mail-Диск .
    Объём диска по умолчанию – целых 100 Гб. Разница по сравнению с Яндекс и Google приличная, как видите:) Тут всё просто и о каких-либо возможностях бесплатного и даже платного расширения дискового пространства речи на официальном сайте не идёт. Я думаю, 100 Гб халявного места никому не помешает, даже если больше заказать нельзя:)

    Но есть один минус – сервис Мэйла не всегда стабилен. Вот вам, как пример:

    Буквально на днях, при попытке зайти в свой аккаунт Mail в районе 1:00 по МСК, он ни в какую не принимал мой логин и пароль, говоря, что я ввожу неверные данные. Логины и пароли у меня автоматически сохраняются в программе RoboForm (прочитать о ней можно ), а также через неё автоматом заполняются и формы авторизации. И поэтому забыть их я никак не мог и ошибиться при вводе тоже. После нескольких безуспешных попыток войти, я попробовал восстановить пароль, и что вы думаете? :) Прислали новый пароль и с ним мне тоже войти не удалось. Немного разозлился и бросил это дело. Попробовал снова не следующий день и успешно вошёл с первого раза. Хотя бы даже поэтому сервисы Мэйла нельзя назвать очень стабильными:)

    Облако Mail

    Microsoft OneDrive .
    Объём бесплатного свободного пространства после регистрации составляет 15 Гб. Как и в Яндексе, имеется возможность бесплатно расширить объём до 23 Гб. 3 Гб сервис даст за создание резервной копии фотографий с камеры и ещё +0.5 Гб за каждого приглашённого участника по реферальной программе. Максимум – 10 приглашённых, что увеличит ваш объём ещё на 5 Гб:

    Что касается приобретения свободного места за плату, то тут Microsoft предлагает вот такие варианты:

    Т.е. стоимость 1 Тб свободного места + офисный пакет (Office 365) для всех устройств обойдутся нам всего в 199 рублей. Правда, вероятно, такое предложение ограниченно каким-то промежутком времени.

    onedrive

    Mega .
    Объём свободного пространства, предоставляемого бесплатно равен 50 Гб. Расширить свободное место можно только за деньги.

    На сайте указана цена за 2 Тб = 19.99 евро. Рассчитаем по сегодняшнему курсу: 1 евро = 51.5 руб. Итого за 2 Тб с нас берут около 1029.5 рублей. Делим на 2 и получаем для сравнения примерную стоимость 1 Тб равную 515 руб.

    Это чуть дороже, чем на Google и всё равно значительно меньше, чем на дорогом Яндексе, где берут 900 рублей за терабайт:)

    Да и тем более при оплате сразу за год получаем скидки.

    При всём этом сервис стабилен и удобен, замечаний у меня лично к нему пока не было…

    Mega

    Эти 5 перечисленных выше онлайн-сервисов для хранения данных я, пожалуй, подчеркну как основные. Для каждого из них есть специальная программа для компьютера и мобильные приложения для Androind, iOS. При помощи этих программ работать с онлайн-дисками очень удобно, где бы вы ни находились.

    Как видно, основное и главное отличие всех этих сервисов – доступный объём диска после регистрации.

    Почему выделил именно эти сервисы? Главная причина как раз – объём свободного места, который предоставляется бесплатно. В них он вполне хороший. Даже на Яндексе, где бесплатно даётся объём в 10 Гб, можно его расширить до 20 Гб бесплатно, приглашая участников. Ну а в оставшихся трёх начальный объём итак выше:) У Мэйла он самый большой, но стабильность хромает…

    Есть, конечно, ещё и другие облачные хранилища, но объём свободного места, предоставляемого бесплатно в них совсем невелик. Например, в Dropbox предоставляют всего 2 Гб бесплатно. Зачем нам такой объём маленький объём, если можно воспользоваться сразу 5-ю сервисами, о которых я выше писал, не так ли? Причём можно сделать в некоторых случаях и по 2 и более аккаунта в нужном облачном сервисе.

    Я рекомендую регистрироваться во всех перечисленных сервисах, ведь это бесплатно! Свободного пространства для хранения данных никогда не бывает много. Не умещается всё на одном, распределяете ещё на другие и, думаю, объёма по умолчанию, если просуммировать все 5 сервисов, хватит всем вполне:)

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

    Ну а сейчас на этом всё… Прощаюсь с Вами на неделю;) Пока!

    Файловая система Android очень похожа на файловые системы, основанные на дисках, используемые в других системах. В данном уроке рассказывается как работать с файловой системой Android, читать и записывать файлы, используя класс File .

    Выбор между внутренним и внешним хранилищем

    Все устройства под Android имеют два пространства для хранения файлов: внешнее и внутреннее хранилища. Эти названия остались от первых устройств на Android. На большинстве устройств применялась энергозависимая память (внутреннее хранилище ) и съемные устройства, вроде microSD карт (внешнее хранилище ). На некоторых устройствах постоянное место хранения делится между внутренним и внешним разделами, поэтому даже без SD карт у нас будет и “внутреннее” и “внешнее” пространство. При этом для API неважно располагается ли внешнее пространство на съемном устройстве или нет. В списке приведены общие факты об обоих типах пространства:

    • Внутреннее хранилище:
    • Всегда доступно.
    • По умолчанию доступ к файлам разрешен только для приложений, создавших эти файлы.
    • При удалении приложения, из внутреннего хранилища удаляются все файлы приложения.
    • Внутреннее хранилище лучше подходит, если вы хотите быть уверены, что другие приложения не получат доступ к данным.
    • Внешнее хранилище:
    • Не всегда доступно, поскольку пользователь может вытащить съемную память из устройства.
    • Файлы могут быть прочитаны любым приложением.
    • При удалении приложения файлы будут удалены только в том случае, если вы сохранили их в директории, полученной с помощью метода getExternalFilesDir() .
    • Внешнее хранилище – это отличное место для файлов, которые не нуждаются в особой секретности. Также во внешних хранилищах могут храниться файлы, которые могут быть открыты на компьютере пользователя или те, которые вы хотите использовать сразу в нескольких приложениях.
    Получение прав для внешнего хранилища

    Для записи во внешнее хранилище, вы должны запросить права WRITE_EXTERNAL_STORAGE в файле манифеста :

    ...

    < manifest . . . >

    < uses - permission android : name = "android.permission.WRITE_EXTERNAL_STORAGE" / >

    . . .

    < / manifest >

    Внимание: в настоящее время, все приложения имеют права на чтение файлов из внешнего хранилища без получения специального разрешения. Однако это изменится в будущих версиях. Если ваше приложение должно читать файлы из внешнего хранилища (но не писать), необходимо получить право READ_EXTERNAL_STORAGE . Чтобы гарантировать, что ваше приложение всегда будет работать так, как вы ожидаете, объявляйте права на чтение уже сейчас, чтобы не беспокоиться об этом в будущем:

    ...

    < manifest . . . >

    < uses - permission android : name = "android.permission.READ_EXTERNAL_STORAGE" / >

    . . .

    < / manifest >

    Однако если ваше приложение использует право на запись WRITE_EXTERNAL_STORAGE , права на чтение будут неявно заданы.

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

    Сохранение файлов во внутреннем хранилище

    При сохранении файлов во внутреннем хранилище, можно получить соответствующую директорию как объект типа File , вызвав один из методов:

    getFilesDir() Возвращает объект типа File представляющий директорию внутреннего хранилища для вашего приложения. getCacheDir() Возвращает объект типа File представляющий директорию внутреннего хранилища для хранения временных кэш файлов. Обязательно удаляйте все файлы, как только вы перестаете в них нуждаться и установите разумное ограничение на количество памяти, которое вы используете в определенный момент времени, например 1Мб. Если в системе останется мало места для хранения, она может удалить ваши временные файлы без предупреждения.

    Чтобы создать новый файл в одной из директорий, вы можете использовать конструктор File() , передав в него объект типа File, полученный с помощью соответствующего метода:

    File file = new File(context.getFilesDir(), filename);

    File file = new File (context . getFilesDir () , filename ) ;

    Можно также использовать метод openFileOutput() для получения объекта FileOutputStream , который записывает файл во внутренний каталог. Пример записи некоторого текста в файл:

    String filename = "myfile"; String string = "Hello world!"; FileOutputStream outputStream; try { outputStream = openFileOutput(filename, Context.MODE_PRIVATE); outputStream.write(string.getBytes()); outputStream.close(); } catch (Exception e) { e.printStackTrace(); }

    String filename = "myfile" ;

    String string = "Hello world!" ;

    FileOutputStream outputStream ;

    try {

    outputStream = openFileOutput (filename , Context . MODE_PRIVATE ) ;

    outputStream . write (string . getBytes () ) ;

    outputStream . close () ;

    } catch (Exception e ) {

    e . printStackTrace () ;

    Или если необходимо создать временный файл, используйте createTempFile() . В следующем примере метод получает имя файла из URL и создает файл с указанным именем во внутренней временной директории:

    public File getTempFile(Context context, String url) { File file; try { String fileName = Uri.parse(url).getLastPathSegment(); file = File.createTempFile(fileName, null, context.getCacheDir()); catch (IOException e) { // Ошибка при создании файла } return file; }

    public File getTempFile (Context context , String url ) {

    File file ;

    try {

    String fileName = Uri . parse (url ) . getLastPathSegment () ;

    file = File . createTempFile (fileName , null , context . getCacheDir () ) ;

    catch (IOException e ) {

    // Ошибка при создании файла

    return file ;

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

    Сохранение файлов во внешнем хранилище

    Поскольку внешнее хранилище может быть недоступно – например при подключении устройства к компьютеру или при удалении SD карты, вы должны всегда проверять раздел на доступность, прежде чем попытаться его использовать. Вы можете запросить состояние внешнего хранилища с помощью метода getExternalStorageState() . Если метод вернул состояние, равное MEDIA_MOUNTED , вы можете читать и записывать ваши файлы. Пример метода проверки внешнего хранилища на доступность:

    /* Проверяем хранилище на доступность чтения и записи*/ public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; } /* Проверяем внешнее хранилище на доступность чтения */ public boolean isExternalStorageReadable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return true; } return false; }

    /* Проверяем хранилище на доступность чтения и записи*/

    public boolean isExternalStorageWritable () {

    if (Environment . MEDIA_MOUNTED . equals (state ) ) {

    return true ;

    return false ;

    /* Проверяем внешнее хранилище на доступность чтения */

    public boolean isExternalStorageReadable () {

    String state = Environment . getExternalStorageState () ;

    if (Environment . MEDIA_MOUNTED . equals (state ) ||

    Environment . MEDIA_MOUNTED_READ_ONLY . equals (state ) ) {

    return true ;

    return false ;

    Хотя содержимое внешнего хранилища может быть изменено пользователем или другим приложением, есть две категории файлов, которые вы можете в нем хранить:

    Публичные файлы Файлы, которые должны быть доступны другим приложениям и пользователям. После удаления приложения эти файлы должны оставаться доступными пользователю. Это, например, фотографии, сделанные в вашем приложении, или скачанные файлы. Приватные файлы Файлы, по праву принадлежащие приложению, которые должны быть удалены вместе с приложением. Хотя эти файлы технически доступны для пользователя и других приложений, поскольку они находятся во внешнем хранилище, реально они не предоставляют свои данные за пределами приложения. При удалении приложения, все такие файлы будут также удалены. Это, к примеру, временные медиа-файлы.

    Если вы хотите сохранить публичные файлы по внешнем хранилище, используйте метод getExternalStoragePublicDirectory() для получения объекта типа File соответствующего каталогу. В качестве аргумента метод принимает тип файла, который вы хотите сохранить, логически он может быть организован с другими публичными файлами, например каталоги музыки (DIRECTORY_MUSIC) или картинок (DIRECTORY_PICTURE). Например:

    public File getAlbumStorageDir(String albumName) { // Получение публичного каталога картинок File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file; }

    public File getAlbumStorageDir (String albumName ) {

    // Получение публичного каталога картинок

    File file = new File (Environment . getExternalStoragePublicDirectory (

    Environment . DIRECTORY_PICTURES ) , albumName ) ;

    if (! file . mkdirs () ) {

    Log . e (LOG_TAG , "Directory not created" ) ;

    return file ;

    Если вы хотите сохранить приватный файл приложения, воспользуйтесь методом getExternalFilesDir() и передайте имя типа директории. Каждая созданная таким образом директория добавляется к корневой директории вашего приложения и собирает в себе все внешние файлы, которые будут удалены вместе с приложением.

    Пример создания директории собственного фотоальбома:

    public File getAlbumStorageDir(Context context, String albumName) { // Получение приватной директории для фотоальбома приложения File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file; }

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

    Очень важно использовать имена директорий, представленных константами API, такие как DIRECTORY_PICTURES независимо от того, использовался ли метод getExternalFilesDir() или getExternalStoragePublicDirectory() . Предопределенные имена директорий позволяют системе правильно обрабатывать ваши файлы. Например, файлы сохраненные в директории DIRECTORY_RINGTONES будут помечены системным медиа-сканером как мелодии звонка, а не как музыкальные файлы.

    Запрос свободного пространства

    Если вы заранее знаете как много данных вам надо сохранить, вы можете узнать достаточно ли места, не дожидаясь исключения IOException , с помощью методов getFreeSpace() или getTotalSpace() . Данные методы позволяют узнать количество свободного и общего пространства на разделе хранилища, соответственно. Данная информация также полезна, чтобы избежать заполнения раздела хранилища выше определенного порога.

    Однако система не гарантирует, что вы можете записать столько же, сколько показывает метод getFreeSpace() . Если свободного места немного больше, чем вы хотите сохранить, или если файловая система заполнена меньше, чем на 90%, вероятно можете продолжать, иначе лучше воздержаться.

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