Статьи

Android для Windows 8: работа с файлами

Узнайте, как писать код в приложениях Магазина Windows для Windows 8 для сохранения файлов, таких как фотографии или документы . Вы можете хранить эти файлы в определенных местах приложения или сохранять их на внешнем носителе, например на USB-накопителе.

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

Вот как хранилище файлов для конкретных приложений работает за кулисами в приложениях Магазина Windows. Каждое приложение может хранить файлы в отдельном наборе каталогов (называемых  локальнымиперемещаемыми и  временными  каталогами) на определенном устройстве:

· Локальный каталог содержит файлы, которые существуют только на локальном устройстве.

· Каталог роуминга содержит файлы, которые существуют на всех устройствах, где пользователь установил приложение.

· Временный каталог похож на локальный каталог, но система может удалить его файлы в любое время.

Когда пользователь устанавливает приложение Магазина Windows, Windows автоматически создает эти каталоги. Вам не нужно беспокоиться о том, где их найти, потому что Windows отслеживает их для вас. Вы просто используете  класс ApplicationData для доступа к ним. Если пользователь удаляет приложение, Windows автоматически удаляет соответствующие каталоги, поэтому вам даже не нужно беспокоиться об их очистке.

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

Для хранения файлов на внешних носителях вы можете использовать классы DeviceInformation  и  StorageDevice  . Подробнее об этом позже.

Вот как это сделать в коде.

Сохраните файл в каталог приложения

В приложении Магазина Windows, чтобы сохранить файл с именем hello.txt, напишите такой код для локального каталога.

var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("Hello.txt");
await FileIO.WriteTextAsync(file, "Hello world!");

Или напишите такой код для роумингового каталога.

var file = await ApplicationData.Current.RoamingFolder.CreateFileAsync("Hello.txt");
await FileIO.WriteTextAsync(file, "Hello world!");

И вы можете написать такой код для временного каталога.

var tempFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync("TempFile.txt");

Android-совет
В приложениях для Android напишите такой код для локального каталога.
File tempFile;
tempFile = File.createTempFile("TempFile.txt", null, context.getCacheDir());

String filename = "hello.txt";
String string = "Hello world!";
FileOutputStream outputStream;

outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
outputStream.write(string.getBytes());outputStream.close();

Установите режим создания файла на  MODE_PRIVATE,  чтобы другие приложения не могли получить доступ к файлам вашего приложения. Приложения Магазина Windows, напротив, могут получать доступ только к своим файлам.

Напишите такой код для временного каталога.

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

В приложении Магазина Windows вы должны объявить возможность  съемного хранилища в  файле Package.appsxmanifest,  связанном с вашим приложением.

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

public async Task<bool> IsExternalStorageAvailable()
{
  var devices = await DeviceInformation.FindAllAsync(StorageDevice.GetDeviceSelector());
   if (devices.Count > 0)
    return true;
   else
    return false;
}

Если доступен внешний носитель, создайте файл, используя следующий код.

var storage = StorageDevice.FromId(deviceInformation.Id);
await storage.CreateFileAsync("HelloWorld.png");

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

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

После того, как вы запросите это разрешение, проверьте, доступны ли внешние носители, используя такой код.

public boolean isExternalStorageWritable() {    
 String state = Environment.getExternalStorageState();
 if (Environment.MEDIA_MOUNTED.equals(state)) {
   return true;
 }
  return false;
}

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

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "HelloWorld.png");