Input/Output
Input/Output API содержит следующие компоненты:
- Filesystem (этот API обеспечивает доступ к файловой системе устройства.)
- Archive (этот API предоставляет интерфейсы и методы для создания архивного файла, а также различные другие виды манипуляций (например, разархивирование файлов, добавление файла к архиву)
- Message Port (этот API предоставляет функциональные возможности для общения с другими приложениями)
Archive API
Определение типов
FileReference
Ссылка на архивный файл может быть, как объект file, так и виртуальный каталог.
ArchiveCompressionLevel
Степень компрессии определяется в перечислении ArchiveCompressionLevel.
enum ArchiveCompressionLevel {"STORE", "FAST", "NORMAL", "BEST"};
- STORE – Компрессия отсутствует. Файл хранится в неизменном виде.
- FAST – Используется наиболее быстрый метод компрессии. Экономия места от сжатия небольшая
- NORMAL – Заданный по умолчанию уровень компрессии
- BEST – Наилучший, но медленный уровень компрессии.
Интерфейсы
ArchiveManagerObject
Интерфейс ArchiveManagerObject определяет тип экземпляра объекта Tizen.
Объект tizen.archive дает доступ к Archive API.
ArchiveManager
Интерфейс ArchiveManager предоставляет методы для работы с архивными файлами.
Методы
Open
Открывает архивный файл. После этой операции, можно добавить или получить файлы в и из архива.
Существует несколько режимов работы этого метода.
| Режим | Описание |
|---|---|
| r | Этот режим используется для получения информации о содержимом архивного файла |
| w | Этот режим используется для того, чтобы создать архивный файл и добавлять файлы в архивный файл |
| rw | Этот режим используется для архивации/разархивации |
| a | Этот режим используется для добавления новых файлов в архивный файл |
Для работы с Archive API используются привилегии filesystem.read filesystem.write.
К сожалению, не все функции по работе с файловой системой доступны в эмуляторе Tizen. Продемонстрируем это на следующем примере. Создадим проект Archive. Добавим папку downloads и запишем туда зиповский архив my_archive.zip.
Просмотрим содержание папки downloads (физический каталог)
<script type="text/javascript">
var documentsDir;
function onsuccess(files) {
for (var i = 0; i < files.length; i++) {
console.log("File Name is " + files[i].name); // displays file name
}
}
function onerror(error) {
console.log("The error " + error.message + " occurred when listing the files in the selected folder");
}
tizen.filesystem.resolve(
'downloads',
function(dir) {
documentsDir = dir;
dir.listFiles(onsuccess, onerror);
}, function(e) {
console.log("Error" + e.message);
}, "rw"
);
</script>
Программа не отображает файл my_archive.zip.
Все-таки попытаемся открыть файл my_archive.zip.
<script type="text/javascript">
function successCallback(archive) {
console.log("Success, can now read from archive " + archive);
}
function errorCallback(error) {
console.log(error);
}
tizen.archive.open("downloads/my_archive.zip", "r", successCallback, errorCallback);
</script>
Программа говорит, что архив не найден.
Пойдем по другому пути. Создадим файл poem.txt в каталоге downloads:
<script type="text/javascript">
//Creating the file
var documentsDir;
function onsuccess(files) {
for (var i = 0; i < files.length; i++) {
console.log("File Name is " + files[i].name); // displays file name
}
var testFile = documentsDir.createFile("poem.txt");
if (testFile != null) {
testFile.openStream(
"w",
function(fs) {
fs.write("To be, or not to be: that is the question");
fs.close();
}, function(e) {
console.log("Error " + e.message);
}, "UTF-8"
);
}
}
function onerror(error) {
console.log("The error " + error.message + " occurred when listing the files in the selected folder");
}
tizen.filesystem.resolve(
'downloads',
function(dir) {
documentsDir = dir;
dir.listFiles(onsuccess, onerror);
}, function(e) {
console.log("Error" + e.message);
}, "rw"
);
</script>
Заархивируем его:
<script type="text/javascript">
//Adding to archive
function errorCallback(error) {
console.log(error);
}
function successCallback() {
console.log("done");
}
function progressCallback(opId, val, name) {
console.log("opId: " + opId + " with progress val: " + val);
}
function createSuccess(archive) {
archive.add("downloads/poem.txt", successCallback, errorCallback, progressCallback);
}
tizen.archive.open("downloads/poem.zip", "w", createSuccess);
</script>
А теперь снова попробуем открыть архивный файл:
<script type="text/javascript">
function successCallback(archive) {
console.log("Success, can now read from archive " + archive);
}
function errorCallback(error) {
console.log(error);
}
tizen.archive.open("downloads/poem.zip", "r", successCallback, errorCallback);
</script>
Как видим, теперь все нормально. Проблема в том, что в Project Explorer мы не видим файлы poem.txt и poem.zip, хотя и можем с ними работать, в то время как наша программа не видит файл some_archive.zip, который мы прекрасно видим в Project Explorer.
FileSystem API
Filesystem API предоставляет доступ к файловой системе устройства. Такую файловую систему можно представить, как абстрактную коллекцию разрозненных файловых систем, расположенных в нескольких виртуальных корневых каталогах.
Каждый виртуальный корневой каталог имеет строковое имя. Каждый файл или каталог внутри виртуальной файловой системы адресуется с использованием полностью определенного пути: <root name>/<path> где <rootname> - это название виртуального корневого каталога, а <path> - это путь к файлу или каталогу относительно этого корневого каталога.
Поддерживаются следующие корневые каталоги
- images – расположение изображений
- videos – расположение видео
- music – расположение звуков
- documents – расположение документов
- downloads – расположение загруженных объектов
- ringtones – расположение рингтонов (только для чтения)
- camera – расположение фотографий и видео, снятых устройством
- wgt-package – расположение виджетов (только для чтения)
- wgt-private – расположение для частных виджетов (только для чтения)
- wgt-private-tmp – расположение для энергонезависомого хранения виджетов
Также поддерживается файловый путь URI. Для доступа к другим путям из виртуального коревого каталога, например, '/tmp/', можно использовать путь 'file:///tmp' в качестве параметра месторасположения.
Для получения доступа к конкретному месторасположению, отличного от упомянутого выше, дескриптор файла должен быть получен с помощью вызова filesystem.resolve().
Дескриптор файла представляет, как файл, так и каталог:
- Для файла атрибуту isFile присваивается значение true.
- Для каталога атрибуту isDirectory присваивается значение true.
Файл можно открыть с помощью операций read и write, используя обработчик событий FileStream. Список файлов и подкаталогов можно получить из каталога, существует метод разрешения файлов или подкаталогов, более удобный, чем обработка списка каталогов.
В именах файлов поддерживаются следующие символы:
- Буквы (a-z, A-Z)
- Числа (0-9)
- Пробелы
- Нижнее подчеркивание ("_")
- Дефис ("-")
- Период (".")
В зависимости от используемой платформы могут также поддерживаться и дополнительные символы
Режимы работы с файлами (FileMode)
Описываются в специальном перечислении при открытии файлов
enum FileMode { "r", "rw", "w", "a" };
• - r – доступ только для чтения (read-only)
- rw – доступ как для чтения, так и для записи (read and write)
- w – доступ для записи (write)
- a – доступ для добавления (append)
Тип файлового хранилища (FileSystemStorageType)
Описывается в специальном перечислении
enum FileSystemStorageType { "INTERNAL", "EXTERNAL" };
- INTERNAL – Внутренне хранилище, которое не может быть удалено, например флеш-память
- EXTERNAL – Внешнее хранилище, например, USB-диск или карта памяти
Состояние файловой системы (FileSystemStorageState)
Описывается в специальном перечислении
enum FileSystemStorageState {"MOUNTED", "REMOVED", "UNMOUNTABLE"};
- MOUNTED – Устройство смонтировано и доступно для просмотра
- REMOVED – Устройство удалено (применимо только для внешних хранилищ)
- UNMOUNTABLE – Устройство не может быть смонтировано в следствие ошибки
Интерфейсы
Интерфейс FileSystemManagerObject
Интерфес FileSystemManagerObject определяет какой экземпляр создаст объект Tizen. Существует объект tizen.filesystem , который позволяет осуществлять доступ к функциональности Filesystem API.
Разберем несколько типичных операций, выполняемых с файловой системой.
1. Создание файла
В файле config.xml добавьте три строчки как показано ниже
<?xml version="1.0" encoding="UTF-8"?>
<widget xmlns:tizen="http://tizen.org/ns/widgets" xmlns="http://www.w3.org/ns/widgets" id="http://yourdomain/fs6" version="1.0.0" viewmodes="maximized">
<tizen:application id="0D6KibKof7.fs6" package="0D6KibKof7" required_version="2.3"/>
<content src="index.html"/>
<feature name="http://tizen.org/feature/screen.size.all"/>
<icon src="icon.png"/>
<name>fs6</name>
<tizen:privilege name="http://tizen.org/privilege/filesystem.read"/>
<tizen:privilege name="http://tizen.org/privilege/filesystem.write"/>
<tizen:privilege name="http://tizen.org/api/filesystem"/>
<tizen:profile name="mobile"/>
</widget>
Файл index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<meta name="description" content="A single-page template generated by Tizen Web IDE"/>
<title>Tizen Web IDE - Tizen - jQuery Mobile - Single-Page</title>
<link rel="stylesheet" href="./css/jquery.mobile-1.3.2.css"/>
<script type="text/javascript" src="./js/jquery-1.9.1.js"></script>
<script type="text/javascript" src="./js/jquery.mobile-1.3.2.js"></script>
<script type="text/javascript" src="./js/main.js"></script>
<link rel="stylesheet" href="./css/style.css" />
<script type="text/javascript">
//Creating a file
var documentsDir;
function onsuccess(files) {
for (var i = 0; i < files.length; i++) {
console.log("File Name is " + files[i].name); // displays file name
}
var testFile = documentsDir.createFile("phrase.txt");
if (testFile != null) {
testFile.openStream(
"w",
function(fs) {
fs.write("When a father gives to his son, both laugh; when a son gives to his father, both cry. (William Shakespeare)");
fs.close();
}, function(e) {
console.log("Error " + e.message);
}, "UTF-8"
);
}
}
function onerror(error) {
console.log("The error " + error.message + " occurred when listing the files in the selected folder");
}
tizen.filesystem.resolve(
'documents',
function(dir) {
documentsDir = dir; dir.listFiles(onsuccess,onerror);
}, function(e) {
console.log("Error" + e.message);
}, "rw"
);
</script>
</head>
<body>
</body>
</html>
2. Просмотр содержимого каталога
Файл index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<meta name="description" content="A single-page template generated by Tizen Web IDE"/>
<title>Tizen Web IDE - Tizen - jQuery Mobile - Single-Page</title>
<link rel="stylesheet" href="./css/jquery.mobile-1.3.2.css"/>
<script type="text/javascript" src="./js/jquery-1.9.1.js"></script>
<script type="text/javascript" src="./js/jquery.mobile-1.3.2.js"></script>
<script type="text/javascript" src="./js/main.js"></script>
<link rel="stylesheet" href="./css/style.css" />
<script type="text/javascript">
//Просмотр списка файлов в каталоге
/* Success event handler */
var documentsDir;
function onsuccess(files) {
for (var i = 0; i < files.length; i++) {
console.log("File Name is " + files[i].name); // displays file name
}
}
tizen.filesystem.resolve(
'documents',
function(dir) {
documentsDir = dir;
dir.listFiles(onsuccess, onerror);
}, function(e) {
console.log("Error" + e.message);
}, "rw"
);
</script>
</head>
<body>
</body>
</html>
3. Чтение содержимого файла
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<meta name="description" content="A single-page template generated by Tizen Web IDE"/>
<title>Tizen Web IDE - Tizen - jQuery Mobile - Single-Page</title>
<link rel="stylesheet" href="./css/jquery.mobile-1.3.2.css"/>
<script type="text/javascript" src="./js/jquery-1.9.1.js"></script>
<script type="text/javascript" src="./js/jquery.mobile-1.3.2.js"></script>
<script type="text/javascript" src="./js/main.js"></script>
<link rel="stylesheet" href="./css/style.css" />
<script type="text/javascript">
//Read as text
function onsuccess(files) {
for (var i = 0; i < files.length; i++) {
console.log("File Name is " + files[i].name); // displays file name
if (files[i].isDirectory == false)
files[i].readAsText(
function(str) {
console.log("The file content " + str);
}, function(e) {
console.log("Error " + e.message);
}, "UTF-8"
);
}
}
function onerror(error) {
console.log("The error " + error.message + " occurred when listing the files in the selected folder");
}
var documentsDir;
tizen.filesystem.resolve(
'documents',
function(dir) {
documentsDir = dir;
dir.listFiles(onsuccess,onerror);
}, function(e) {
console.log("Error" + e.message);
}, "rw"
);
</script>
</head>
<body>
</body>
</html>
4. Удаление содержимого каталога
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<meta name="description" content="A single-page template generated by Tizen Web IDE"/>
<title>Tizen Web IDE - Tizen - jQuery Mobile - Single-Page</title>
<link rel="stylesheet" href="./css/jquery.mobile-1.3.2.css"/>
<script type="text/javascript" src="./js/jquery-1.9.1.js"></script>
<script type="text/javascript" src="./js/jquery.mobile-1.3.2.js"></script>
<script type="text/javascript" src="./js/main.js"></script>
<link rel="stylesheet" href="./css/style.css" />
<script type="text/javascript">
//Deleting files in the directory
function onsuccess(files) {
for (var i = 0; i < files.length; i++) {
if (!files[i].isDirectory) {
documentsDir.deleteFile(
files[i].fullPath,
function() {
console.log("File Deleted");
}, function(e) {
console.log("Error" + e.message);
});
}
}
}
function onerror(error) {
console.log("The error " + error.message + " occurred when listing the files in the selected folder");
}
var documentsDir;
tizen.filesystem.resolve(
'documents',
function(dir) {
documentsDir = dir;
dir.listFiles(onsuccess,onerror);
}, function(e) {
console.log("Error" + e.message);
}, "rw"
);
</script>
</head>
<body>
</body>
</html>
MessagePort API
MessagePort API предоставляет функциональность для связи с другими приложениями.
Веб-приложения Tizen могут могут общаться с другими веб- или нативными приложениями. Тип данных для коммуникации представляет собой строковую пару "ключ-значение". Сообщения можно пересылать через месседж-порты двух типов:
- интерфейс LocalMessagePort используется для регистрации месседж-порта и подготовке к приему сообщений от других приложений. Для приема сообщений от других приложений необходимо зарегистрировать функцию вызова для локального месседж-порта.
- интерфейс RemoteMessagePort используется для отправки сообщений другим приложениям. Информация локального месседж-порта может быть послана другому приложению для двустороннего обмена данными.
Можно получать экземпляры интерфейсов LocalMessagePort и RemoteMessagePort с помощью методов therequestLocalMessagePort() и requestRemoteMessagePort() объекта tizen.messageport.
Месседж-порт поддерживает следующие методы для отправки и приемы сообщений:
- метод sendMessage() интерфейса RemoteMessagePort для отправки сообщений другим приложениям. Для приема ответных сообщений от другого приложения в приложении можно определить локальный месседж-порт при отправке сообщения. Можно получать ответное сообщение с помощью вызова метода, зарегистрированного методом addMessagePortListener() интерфейса LocalMessagePort.
- приложение, которое хочет получать сообщения от другого приложения, может быть имплементировано как веб-ли нативное приложение Tizen.
Вы можете общаться только с доверенным приложениям, которые подписываются таким же сертификатом, что и ваше приложение, с помощью экземпляров интерфейсов LocalMessagePort и RemoteMessagePort, которые извлекаются с помощью методов TrustedLocalMessagePort() и TrustedRemoteMessagePort () объекта tizen.messageport.
Литература
- https://developer.tizen.org/dev-guide/2.3.0/org.tizen.web.apireference/html/device_api/mobile/tizen/archive.html
- https://developer.tizen.org/dev-guide/2.3.0/org.tizen.guides/html/web/tizen/input_output/message_port_w.htm
- https://www.tizen.org/ko/tv/web_device_api/filesystem?langredirect=1
Задание
Самостоятельно освоить: создание каталогов, копирование и перенос файлов












