Опубликован: 12.12.2015 | Доступ: свободный | Студентов: 665 / 96 | Длительность: 15:42:00
Лекция 19:

Input/Output

< Лекция 18 || Лекция 19 || Лекция 20 >

Input/Output API содержит следующие компоненты:

  • Filesystem (этот API обеспечивает доступ к файловой системе устройства.)
  • Archive (этот API предоставляет интерфейсы и методы для создания архивного файла, а также различные другие виды манипуляций (например, разархивирование файлов, добавление файла к архиву)
  • Message Port (этот API предоставляет функциональные возможности для общения с другими приложениями)

Archive API

Определение типов

FileReference

Ссылка на архивный файл может быть, как объект file, так и виртуальный каталог.

ArchiveCompressionLevel

Степень компрессии определяется в перечислении ArchiveCompressionLevel.

enum ArchiveCompressionLevel {&quot;STORE&quot;, &quot;FAST&quot;, &quot;NORMAL&quot;, &quot;BEST&quot;};
  • STORE – Компрессия отсутствует. Файл хранится в неизменном виде.
  • FAST – Используется наиболее быстрый метод компрессии. Экономия места от сжатия небольшая
  • NORMAL – Заданный по умолчанию уровень компрессии
  • BEST – Наилучший, но медленный уровень компрессии.

Интерфейсы

ArchiveManagerObject

Интерфейс ArchiveManagerObject определяет тип экземпляра объекта Tizen.

Объект tizen.archive дает доступ к Archive API.

ArchiveManager

Интерфейс ArchiveManager предоставляет методы для работы с архивными файлами.

Методы

Open

Открывает архивный файл. После этой операции, можно добавить или получить файлы в и из архива.

Существует несколько режимов работы этого метода.

Таблица 19.1. Режимы работы метода Open
Режим Описание
r Этот режим используется для получения информации о содержимом архивного файла
w Этот режим используется для того, чтобы создать архивный файл и добавлять файлы в архивный файл
rw Этот режим используется для архивации/разархивации
a Этот режим используется для добавления новых файлов в архивный файл

Для работы с Archive API используются привилегии filesystem.read filesystem.write.

К сожалению, не все функции по работе с файловой системой доступны в эмуляторе Tizen. Продемонстрируем это на следующем примере. Создадим проект Archive. Добавим папку downloads и запишем туда зиповский архив my_archive.zip.


Рис. 19.2.

Просмотрим содержание папки downloads (физический каталог)

&lt;script type=&quot;text/javascript&quot;&gt;

    var documentsDir;
    function onsuccess(files) {
      for (var i = 0; i &lt; files.length; i++) {
        console.log(&quot;File Name is &quot; + files[i].name); // displays file name
      }
    }

    function onerror(error) {
      console.log(&quot;The error &quot; + error.message + &quot; occurred when listing the files in the selected folder&quot;);
    }

    tizen.filesystem.resolve(
      &apos;downloads&apos;,
      function(dir) {
        documentsDir = dir;
        dir.listFiles(onsuccess, onerror);
      }, function(e) {
        console.log(&quot;Error&quot; + e.message);
      }, &quot;rw&quot;
    ); 
   
    &lt;/script&gt;


Рис. 19.3.

Программа не отображает файл my_archive.zip.

Все-таки попытаемся открыть файл my_archive.zip.

    &lt;script type=&quot;text/javascript&quot;&gt;

    function successCallback(archive) {
        console.log(&quot;Success, can now read from archive &quot; + archive);
    }

    function errorCallback(error) {
        console.log(error);
    }

    tizen.archive.open(&quot;downloads/my_archive.zip&quot;, &quot;r&quot;, successCallback, errorCallback);

    &lt;/script&gt;


Рис. 19.4.

Программа говорит, что архив не найден.

Пойдем по другому пути. Создадим файл poem.txt в каталоге downloads:

&lt;script type=&quot;text/javascript&quot;&gt;

  //Creating the file

    var documentsDir;
    function onsuccess(files) {
      for (var i = 0; i &lt; files.length; i++) {
        console.log(&quot;File Name is &quot; + files[i].name); // displays file name
      }

      var testFile = documentsDir.createFile(&quot;poem.txt&quot;);

      if (testFile != null) {
        testFile.openStream(
          &quot;w&quot;,
          function(fs) {
            fs.write(&quot;To be, or not to be: that is the question&quot;);
            fs.close();
          }, function(e) {
            console.log(&quot;Error &quot; + e.message);
          }, &quot;UTF-8&quot;
        );
      }
    }

    function onerror(error) {
      console.log(&quot;The error &quot; + error.message + &quot; occurred when listing the files in the selected folder&quot;);
    }

    tizen.filesystem.resolve(
      &apos;downloads&apos;,
      function(dir) {
        documentsDir = dir;
        dir.listFiles(onsuccess, onerror);
      }, function(e) {
        console.log(&quot;Error&quot; + e.message);
      }, &quot;rw&quot;
    );
    &lt;/script&gt;


Рис. 19.5.

Заархивируем его:

&lt;script type=&quot;text/javascript&quot;&gt;

//Adding to archive

    function errorCallback(error) {
        console.log(error);
    }

    function successCallback() {
        console.log(&quot;done&quot;);
    }

    function progressCallback(opId, val, name) {
        console.log(&quot;opId: &quot; + opId + &quot; with progress val: &quot; + val);
    }

    function createSuccess(archive) {
        archive.add(&quot;downloads/poem.txt&quot;, successCallback, errorCallback, progressCallback);
    }

    tizen.archive.open(&quot;downloads/poem.zip&quot;, &quot;w&quot;, createSuccess);
    &lt;/script&gt;


Рис. 19.6.

А теперь снова попробуем открыть архивный файл:

&lt;script type=&quot;text/javascript&quot;&gt;

    function successCallback(archive) {
        console.log(&quot;Success, can now read from archive &quot; + archive);
    }

    function errorCallback(error) {
        console.log(error);
    }

    tizen.archive.open(&quot;downloads/poem.zip&quot;, &quot;r&quot;, successCallback, errorCallback);
    &lt;/script&gt;


Рис. 19.7.

Как видим, теперь все нормально. Проблема в том, что в Project Explorer мы не видим файлы poem.txt и poem.zip, хотя и можем с ними работать, в то время как наша программа не видит файл some_archive.zip, который мы прекрасно видим в Project Explorer.


Рис. 19.8.

FileSystem API

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

Каждый виртуальный корневой каталог имеет строковое имя. Каждый файл или каталог внутри виртуальной файловой системы адресуется с использованием полностью определенного пути: &lt;root name&gt;/&lt;path&gt; где &lt;rootname&gt; - это название виртуального корневого каталога, а &lt;path&gt; - это путь к файлу или каталогу относительно этого корневого каталога.

Поддерживаются следующие корневые каталоги

  • images – расположение изображений
  • videos – расположение видео
  • music – расположение звуков
  • documents – расположение документов
  • downloads – расположение загруженных объектов
  • ringtones – расположение рингтонов (только для чтения)
  • camera – расположение фотографий и видео, снятых устройством
  • wgt-package – расположение виджетов (только для чтения)
  • wgt-private – расположение для частных виджетов (только для чтения)
  • wgt-private-tmp – расположение для энергонезависомого хранения виджетов

Также поддерживается файловый путь URI. Для доступа к другим путям из виртуального коревого каталога, например, &apos;/tmp/&apos;, можно использовать путь &apos;file:///tmp&apos; в качестве параметра месторасположения.

Для получения доступа к конкретному месторасположению, отличного от упомянутого выше, дескриптор файла должен быть получен с помощью вызова filesystem.resolve().

Дескриптор файла представляет, как файл, так и каталог:

  • Для файла атрибуту isFile присваивается значение true.
  • Для каталога атрибуту isDirectory присваивается значение true.

Файл можно открыть с помощью операций read и write, используя обработчик событий FileStream. Список файлов и подкаталогов можно получить из каталога, существует метод разрешения файлов или подкаталогов, более удобный, чем обработка списка каталогов.

В именах файлов поддерживаются следующие символы:

  • Буквы (a-z, A-Z)
  • Числа (0-9)
  • Пробелы
  • Нижнее подчеркивание (&quot;_&quot;)
  • Дефис (&quot;-&quot;)
  • Период (&quot;.&quot;)

В зависимости от используемой платформы могут также поддерживаться и дополнительные символы

Режимы работы с файлами (FileMode)

Описываются в специальном перечислении при открытии файлов

enum FileMode { &quot;r&quot;, &quot;rw&quot;, &quot;w&quot;, &quot;a&quot; };
•	
  1. r – доступ только для чтения (read-only)
  2. rw – доступ как для чтения, так и для записи (read and write)
  3. w – доступ для записи (write)
  4. a – доступ для добавления (append)

Тип файлового хранилища (FileSystemStorageType)

Описывается в специальном перечислении

enum FileSystemStorageType { &quot;INTERNAL&quot;, &quot;EXTERNAL&quot; };
  • INTERNAL – Внутренне хранилище, которое не может быть удалено, например флеш-память
  • EXTERNAL – Внешнее хранилище, например, USB-диск или карта памяти

Состояние файловой системы (FileSystemStorageState)

Описывается в специальном перечислении

enum FileSystemStorageState {&quot;MOUNTED&quot;, &quot;REMOVED&quot;, &quot;UNMOUNTABLE&quot;};
  • MOUNTED – Устройство смонтировано и доступно для просмотра
  • REMOVED – Устройство удалено (применимо только для внешних хранилищ)
  • UNMOUNTABLE – Устройство не может быть смонтировано в следствие ошибки

Интерфейсы

Интерфейс FileSystemManagerObject

Интерфес FileSystemManagerObject определяет какой экземпляр создаст объект Tizen. Существует объект tizen.filesystem , который позволяет осуществлять доступ к функциональности Filesystem API.

Разберем несколько типичных операций, выполняемых с файловой системой.

1. Создание файла

В файле config.xml добавьте три строчки как показано ниже

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;widget xmlns:tizen=&quot;http://tizen.org/ns/widgets&quot; xmlns=&quot;http://www.w3.org/ns/widgets&quot; id=&quot;http://yourdomain/fs6&quot; version=&quot;1.0.0&quot; viewmodes=&quot;maximized&quot;&gt;
    &lt;tizen:application id=&quot;0D6KibKof7.fs6&quot; package=&quot;0D6KibKof7&quot; required_version=&quot;2.3&quot;/&gt;
    &lt;content src=&quot;index.html&quot;/&gt;
    &lt;feature name=&quot;http://tizen.org/feature/screen.size.all&quot;/&gt;
    &lt;icon src=&quot;icon.png&quot;/&gt;
    &lt;name&gt;fs6&lt;/name&gt;
    &lt;tizen:privilege name=&quot;http://tizen.org/privilege/filesystem.read&quot;/&gt;
    &lt;tizen:privilege name=&quot;http://tizen.org/privilege/filesystem.write&quot;/&gt;
    &lt;tizen:privilege name=&quot;http://tizen.org/api/filesystem&quot;/&gt;    
    &lt;tizen:profile name=&quot;mobile&quot;/&gt;
&lt;/widget&gt;

Файл index.html

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;/&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0, maximum-scale=1.0&quot;&gt;
    &lt;meta name=&quot;description&quot; content=&quot;A single-page template generated by Tizen Web IDE&quot;/&gt;

    &lt;title&gt;Tizen Web IDE - Tizen - jQuery Mobile - Single-Page&lt;/title&gt;

    &lt;link rel=&quot;stylesheet&quot; href=&quot;./css/jquery.mobile-1.3.2.css&quot;/&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;./js/jquery-1.9.1.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;./js/jquery.mobile-1.3.2.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;./js/main.js&quot;&gt;&lt;/script&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;./css/style.css&quot; /&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;


//Creating a file
 var documentsDir;
 function onsuccess(files) {
   for (var i = 0; i &lt; files.length; i++) {
     console.log(&quot;File Name is &quot; + files[i].name); // displays file name
   }

   var testFile = documentsDir.createFile(&quot;phrase.txt&quot;);
   if (testFile != null) {
     testFile.openStream(
         &quot;w&quot;,
         function(fs) {
           fs.write(&quot;When a father gives to his son, both laugh; when a son gives to his father, both cry. (William Shakespeare)&quot;);
           fs.close();
         }, function(e) {
           console.log(&quot;Error &quot; + e.message);
         }, &quot;UTF-8&quot;
     );
   }
 }

 function onerror(error) {
   console.log(&quot;The error &quot; + error.message + &quot; occurred when listing the files in the selected folder&quot;);
 }

 tizen.filesystem.resolve(
     &apos;documents&apos;,
     function(dir) {
       documentsDir = dir; dir.listFiles(onsuccess,onerror);
     }, function(e) {
       console.log(&quot;Error&quot; + e.message);
     }, &quot;rw&quot;
 ); 


    &lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
    
&lt;/body&gt;
&lt;/html&gt;
2. Просмотр содержимого каталога

Файл index.html

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;/&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0, maximum-scale=1.0&quot;&gt;
    &lt;meta name=&quot;description&quot; content=&quot;A single-page template generated by Tizen Web IDE&quot;/&gt;

    &lt;title&gt;Tizen Web IDE - Tizen - jQuery Mobile - Single-Page&lt;/title&gt;

    &lt;link rel=&quot;stylesheet&quot; href=&quot;./css/jquery.mobile-1.3.2.css&quot;/&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;./js/jquery-1.9.1.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;./js/jquery.mobile-1.3.2.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;./js/main.js&quot;&gt;&lt;/script&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;./css/style.css&quot; /&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;
    //Просмотр списка файлов в каталоге
    /* Success event handler */
var documentsDir;
 function onsuccess(files) {
   for (var i = 0; i &lt; files.length; i++) {
     console.log(&quot;File Name is &quot; + files[i].name); // displays file name
   }
 }

 tizen.filesystem.resolve(
   &apos;documents&apos;,
   function(dir) {
     documentsDir = dir;
     dir.listFiles(onsuccess, onerror);
   }, function(e) {
     console.log(&quot;Error&quot; + e.message);
   }, &quot;rw&quot;
 ); 

    &lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
    
&lt;/body&gt;
&lt;/html&gt;

Рис. 19.9.
3. Чтение содержимого файла
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;/&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0, maximum-scale=1.0&quot;&gt;
    &lt;meta name=&quot;description&quot; content=&quot;A single-page template generated by Tizen Web IDE&quot;/&gt;

    &lt;title&gt;Tizen Web IDE - Tizen - jQuery Mobile - Single-Page&lt;/title&gt;

    &lt;link rel=&quot;stylesheet&quot; href=&quot;./css/jquery.mobile-1.3.2.css&quot;/&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;./js/jquery-1.9.1.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;./js/jquery.mobile-1.3.2.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;./js/main.js&quot;&gt;&lt;/script&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;./css/style.css&quot; /&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;
//Read as text
function onsuccess(files) {
   for (var i = 0; i &lt; files.length; i++) {
     console.log(&quot;File Name is &quot; + files[i].name); // displays file name
     if (files[i].isDirectory == false)
       files[i].readAsText(
           function(str) {
             console.log(&quot;The file content &quot; + str);
           }, function(e) {
             console.log(&quot;Error &quot; + e.message);
           }, &quot;UTF-8&quot;
       );
   }
 }

 function onerror(error) {
   console.log(&quot;The error &quot; + error.message + &quot; occurred when listing the files in the selected folder&quot;);
 }

 var documentsDir;
 tizen.filesystem.resolve(
     &apos;documents&apos;,
     function(dir) {
       documentsDir = dir;
       dir.listFiles(onsuccess,onerror);
     }, function(e) {
       console.log(&quot;Error&quot; + e.message);
     }, &quot;rw&quot;
 ); 


    &lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
    
&lt;/body&gt;
&lt;/html&gt;
4. Удаление содержимого каталога
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;/&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0, maximum-scale=1.0&quot;&gt;
    &lt;meta name=&quot;description&quot; content=&quot;A single-page template generated by Tizen Web IDE&quot;/&gt;

    &lt;title&gt;Tizen Web IDE - Tizen - jQuery Mobile - Single-Page&lt;/title&gt;

    &lt;link rel=&quot;stylesheet&quot; href=&quot;./css/jquery.mobile-1.3.2.css&quot;/&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;./js/jquery-1.9.1.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;./js/jquery.mobile-1.3.2.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;./js/main.js&quot;&gt;&lt;/script&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;./css/style.css&quot; /&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;

//Deleting files in the directory

function onsuccess(files) {
	   for (var i = 0; i &lt; files.length; i++) {
	     if (!files[i].isDirectory) {
	       documentsDir.deleteFile(
	           files[i].fullPath,
	           function() {
	             console.log(&quot;File Deleted&quot;);
	           }, function(e) {
	             console.log(&quot;Error&quot; + e.message);
	           });
	     }
	   }
	 }

	 function onerror(error) {
	   console.log(&quot;The error &quot; + error.message + &quot; occurred when listing the files in the selected folder&quot;);
	 }

	 var documentsDir;
	 tizen.filesystem.resolve(
	   &apos;documents&apos;,
	   function(dir) {
	     documentsDir = dir;
	     dir.listFiles(onsuccess,onerror);
	   }, function(e) {
	     console.log(&quot;Error&quot; + e.message);
	   }, &quot;rw&quot;
	 ); 

    &lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
    
&lt;/body&gt;
&lt;/html&gt;

Рис. 19.11.

MessagePort API

MessagePort API предоставляет функциональность для связи с другими приложениями.

Веб-приложения Tizen могут могут общаться с другими веб- или нативными приложениями. Тип данных для коммуникации представляет собой строковую пару &quot;ключ-значение&quot;. Сообщения можно пересылать через месседж-порты двух типов:

  • интерфейс LocalMessagePort используется для регистрации месседж-порта и подготовке к приему сообщений от других приложений. Для приема сообщений от других приложений необходимо зарегистрировать функцию вызова для локального месседж-порта.
  • интерфейс RemoteMessagePort используется для отправки сообщений другим приложениям. Информация локального месседж-порта может быть послана другому приложению для двустороннего обмена данными.

Можно получать экземпляры интерфейсов LocalMessagePort и RemoteMessagePort с помощью методов therequestLocalMessagePort() и requestRemoteMessagePort() объекта tizen.messageport.

Месседж-порт поддерживает следующие методы для отправки и приемы сообщений:

  • метод sendMessage() интерфейса RemoteMessagePort для отправки сообщений другим приложениям. Для приема ответных сообщений от другого приложения в приложении можно определить локальный месседж-порт при отправке сообщения. Можно получать ответное сообщение с помощью вызова метода, зарегистрированного методом addMessagePortListener() интерфейса LocalMessagePort.
  • приложение, которое хочет получать сообщения от другого приложения, может быть имплементировано как веб-ли нативное приложение Tizen.
Коммуникация месседж-порта

увеличить изображение
Рис. 19.12. Коммуникация месседж-порта

Вы можете общаться только с доверенным приложениям, которые подписываются таким же сертификатом, что и ваше приложение, с помощью экземпляров интерфейсов LocalMessagePort и RemoteMessagePort, которые извлекаются с помощью методов TrustedLocalMessagePort() и TrustedRemoteMessagePort () объекта tizen.messageport.

Литература

Задание

Самостоятельно освоить: создание каталогов, копирование и перенос файлов

< Лекция 18 || Лекция 19 || Лекция 20 >