В настоящее время подсистема распределённых файлов предоставляет приложениям JavaScript API для ввода-вывода, включая API для управления файлами и каталогами, получения информации о файлах, чтения и записи потоков данных файлов, а также получение URI вместо абсолютных путей.
В настоящее время подсистема распределённых файлов предоставляет только локальные JavaScript API файлов для приложений через модули FileIO и File. Подсистема распределённых файлов использует LibN для абстрагирования API на уровне NAPI, предоставляя базовые возможности, такие как система типов, управление памятью и общие модели программирования для подсистемы. Эта подсистема зависит от слоя движка фреймворка разработки приложений на JavaScript для преобразования JavaScript API в C++ код, зависит от фреймворка приложений для предоставления каталогов, связанных с приложением, и зависит от GLIBC для предоставления возможностей ввода-вывода.Рисунок 1 Архитектура подсистемы распределённых файлов
foundation/distributeddatamgr/distributedfile
├── figures # Изображения
├── interfaces # API
│ └── kits # Внешне экспонируемые API
├── utils # Общие компоненты
│ └── filemgmt_libhilog # Компоненты журнала
│ └── filemgmt_libn # Компоненты платформы
Ограничения для локальных API ввода-вывода:
Сейчас распределённая система файлов предоставляет API для доступа к локальным файлам и директориям. Ниже приведена таблица, описывающая типы API, классифицированные по функциям.
Создает, изменяет и предоставляет доступ к файлам, а также изменяет права доступа к файлам на основе указанных абсолютных путей или дескрипторов файла. |
|||
API для поточного чтения/записи файлов
Чтение и запись данных файлов на основе указанных абсолютных путей или дескрипторов файлов.
@OHOS. distributedfile. fileio
Продолжение перевода:
<tr id="row292317176211">
<td class="cellrowborder" valign="top" width="15.02%" headers="mcps1.2.5.1.1 ">
<p id="p292317176211"><a name="p292317176211"></a><a name="p292317176211"></a>API для чтения директорий</p>
</td>
<td class="cellrowborder" valign="top" width="32.25%" headers="mcps1.2.5.1.2 ">
<p id="p292317176211"><a name="p292317176211"></a><a name="p292317176211"></a>Чтение директорий и определение типов файлов на основе указанных абсолютных путей.</p>
</td>
<td class="cellrowborder" valign="top" width="25.84%" headers="mcps1.2.5.1.3 ">
<p id="p292317176211"><a name="p292317176211"></a><a name="p292317176211"></a>@OHOS.distributedfile.fileio</p>
</td>
<td class="cellrowborder" valign="top" width="26.89%" headers="mcps1.2.5.1.4 ">
<p id="p292317176211"><a name="p292317176211"></a><a name="p292317176211"></a>Dir.openDirSync</p>
</td>
</tr>
<table>
<tbody>
<tr id="row82479241516">
<td class="cellrowborder" valign="top" width="15.02%" headers="mcps1.2.5.1.1">
<p id="p12923111711216"><a name="p12923111711216"></a><a name="p12923111711216"></a>API работы с файлами в песочнице</p>
</td>
<td class="cellrowborder" valign="top" width="32.25%" headers="mcps1.2.5.1.2">
<p id="p49237171020"><a name="p49237171020"></a><a name="p49237171020"></a>Предоставляет подмножество или комбинацию возможностей, предоставляемых базовым API файлов, директорий и статистики на основе указанных URI.</p>
</td>
<td class="cellrowborder" valign="top" width="25.84%" headers="mcps1.2.5.1.3">
<p id="p724852418510"><a name="p724852418510"></a><a name="p724852418510"></a>@system.file</p>
</td>
<td class="cellrowborder" valign="top" width="26.89%" headers="mcps1.2.5.1.4">
<p id="p0390135216324"><a name="p0390135216324"></a><a name="p0390135216324"></a>Перемещение</p>
<p id="p202016525456"><a name="p202016525456"></a><a name="p202016525456"></a>Копирование</p>
<p id="p8142558194520"><a name="p8142558194520"></a><a name="p8142558194520"></a>Список</p>
</td>
</tr>
</tbody>
</table>
URI-ы, используемые в API файлов песочницы, разделены на три типа, как показано в следующей таблице.
```**Таблица 2** Типы URI<a name="table947391523311"></a>
<table>
<thead align="left">
<tr id="row84733151332">
<th class="cellrowborder" valign="top" width="13.969999999999999%" id="mcps1.2.5.1.1">
<p id="p32271219113313"><a name="p32271219113313"></a><a name="p32271219113313"></a>Тип директории</p>
</th>
<th class="cellrowborder" valign="top" width="16.41%" id="mcps1.2.5.1.2">
<p id="p3227191993310"><a name="p3227191993310"></a><a name="p3227191993310"></a>Префикс</p>
</th>
<th class="cellrowborder" valign="top" width="22%" id="mcps1.2.5.1.3">
<p id="p192277196333"><a name="p192277196333"></a><a name="p192277196333"></a>Доступность</p>
</th>
<th class="cellrowborder" valign="top" width="47.620000000000005%" id="mcps1.2.5.1.4">
<p id="p18227719103313"><a name="p18227719103313"></a><a name="p18227719103313"></a>Описание</p>
</th>
</tr>
</thead>
<tbody>
<tr id="row1474161514330">
<td class="cellrowborder" valign="top" width="13.969999999999999%" headers="mcps1.2.5.1.1">
<p id="p9896152614335"><a name="p9896152614335"></a><a name="p9896152614335"></a>Темпorary директория</p>
</td>
<td class="cellrowborder" valign="top" width="16.41%" headers="mcps1.2.5.1.2">
<p id="p389632610335"><a name="p389632610335"></a><a name="p389632610335"></a>internal://cache/</p>
</td>
<td class="cellrowborder" valign="top" width="22%" headers="mcps1.2.5.1.3">
<p id="p989610267332"><a name="p989610267332"></a><a name="p989610267332"></a>Только текущее приложение</p>
</td>
<td class="cellrowborder" valign="top" width="47.620000000000005%" headers="mcps1.2.5.1.4">
<p id="p16896726173311"><a name="p16896726173311"></a><a name="p16896726173311"></a>Чтение и запись доступны, а также могут быть очищены в любое время. Эта директория обычно используется для временного скачивания или кэширования.</p>
</td>
</tr>
<tr id="row194741315193312">
<td class="cellrowborder" valign="top" width="13.969999999999999%" headers="mcps1.2.5.1.1">
<p id="p12896142620339"><a name="p12896142620339"></a><a name="p12896142620339"></a>Личная директория приложения</p>
</td>
<td class="cellrowborder" valign="top" width="16.41%" headers="mcps1.2.5.1.2">
<p id="p128961426203310"><a name="p128961426203310"></a><a name="p128961426203310"></a>internal://appdata/</p>
</td>
<td class="cellrowborder" valign="top" width="22%" headers="mcps1.2.5.1.3">
<p id="p128961426203312"><a name="p128961426203312"></a><a name="p128961426203312"></a>Только текущее приложение</p>
</td>
<td class="cellrowborder" valign="top" width="47.620000000000005%" headers="mcps1.2.5.1.4">
<p id="p128961426203314"><a name="p128961426203314"></a><a name="p128961426203314"></a>Эта директория предназначена для хранения данных пользователя, таких как настройки и логи.</p>
</td>
</tr>
</tbody>
</table><p id="p118969269332"><a name="p118969269332"></a><a name="p118969269332"></a>internal://app/</p>
</td>
<td class="cellrowborder" valign="top" width="22%" headers="mcps1. 2. 5. 1. 3 ">
<p id="p189612263333"><a name="p189612263333"></a><a name="p189612263333"></a>Только текущее приложение</p>
</td>
<td class="cellrowborder" valign="top" width="47. 620000000000005%" headers="mcps1. 2. 5. 1. 4 ">
<p id="p189612263333"><a name="p189612263333"></a><a name="p189612263333"></a>Эта директория предназначена для хранения данных конкретного приложения и доступна только этому приложению.</p>
</td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<td class="cellrowborder" valign="top" width="13. 969999999999999%">
<p>Удалена при удалении приложения.</p>
</td>
</tr>
<tr>
<td class="cellrowborder" valign="top" width="13. 969999999999999%"> </td>
<td class="cellrowborder" valign="top" width="16. 41%">
<p> internal://share/ </p>
</td>
<td class="cellrowborder" valign="top" width="22%">
<p>Все приложения</p>
</td>
<td class="cellrowborder" valign="top" width="47. 620000000000005%">
<p>Удалена при удалении приложения. Другие приложения с предоставленными разрешениями могут читать и записывать файлы в этой директории.</p>
</td>
</tr>
</tbody>
</table>
### Правила использования <a name="section149mcpsimp"></a>API ввода/вывода, предоставляемые подсистемой распределённых файлов, можно разделить на следующие типы в зависимости от модели программирования:
- **Синхронная модель программирования**
API, названия которых содержат слово **Sync**, реализованы как синхронная модель. При вызове синхронного API вызывающий процесс ждет до тех пор, пока не будет получен возвращаемый результат.
Пример ниже открывает поток файла в режиме чтения, пытается прочитать первые 4096 байтов, преобразует их в строку, закодированную в UTF-8, а затем закрывает поток файла:
```javascript
import fileio from '@OHOS.distributedfile.fileio';
try {
var ss = fileio.createStreamSync("tmp", "r");
buf = new ArrayBuffer(4096);
ss.readSync(buf);
console.log(String.fromCharCode.apply(null, new Uint8Array(buf)));
ss.closeSync();
}
catch (e) {
console.log(e);
}
```
- **Асинхронная модель программирования: Callback**
В модуле **@OHOS.distributedfile.fileio** API, названия которых не содержат слова **Sync** и которым напрямую передаются callback-функции в качестве входных параметров, реализованы как асинхронная модель с использованием callback. Асинхронная модель с callback также является одним из стандартных асинхронных моделей OHOS. При вызове асинхронного API с переданным callback-обрабатчиком задача выполняется асинхронно, и результат выполнения передается в виде входных параметров зарегистрированного callback-обрабатчика. Первый параметр имеет тип **undefined** или **Error**, что указывает на успешное или неудачное выполнение соответственно.Пример ниже создаёт поток файла асинхронно, асинхронно читает первые 4096 байтов файла при помощи callback-обработчика, вызываемого после создания потока файла, и затем асинхронно закрывает поток файла при помощи callback-обработчика, вызываемого после чтения файла:
```markdown
```javascript
import fileio from '@OHOS.distributedfile.fileio';
try {
fileio.createStream("./testdir/test_stream.txt", "r", function (err, ss) {
if (!err) {
ss.read(new ArrayBuffer(4096), {}, function (err, buf, readLen) {
if (!err) {
console.log('readLen: ' + readLen);
console.log('data: ' + String.fromCharCode.apply(null, new Uint8Array(buf)));
} else {
console.log('Не удалось прочитать данные из потока ' + err);
}
ss.close(function (err) {
console.log(`Поток${err ? ' не' : ''} закрыт`);
});
});
} else {
console.log('Не удалось открыть поток ' + err);
}
});
} catch (e) {
console.log(e);
}
```
```
Асинхронная модель программирования: Наследие
Все API в модуле **@system.file** реализованы как наследственная асинхронная модель. При вызове такого API вам потребуется реализовать три обратные вызовы (включая **success**, **fail** и **complete**) для вызова при успешном выполнении, сбое или завершении операции соответственно. Если входные параметры корректны, API вызывает обратные вызовы **success** или **fail** в зависимости от того, был ли асинхронный задачи выполнен успешно после её выполнения, и затем вызывает обратный вызов **complete**. В следующем примере асинхронно проверяется наличие файла, указанного заданным URI, и предоставляются три обратных вызова для вывода результата проверки:
```markdown
import file from '@system.file'
file.access({
uri: 'internal://app/test.txt',
success: function() {
console.log('access succeeded.');
},
fail: function(data, code) {
console.error('failure callback failed, code: ' + code + ', data: ' + data);
},
complete: function () {
console.log('access completed.');
}
});
console.log("file access test completed")
```
## Участвующие репозитории <a name="section178mcpsimp"></a>
- [**distributeddatamgr_file**](https://gitee.com/openharmony/distributeddatamgr_file)
- [filemanagement_dfs_service](https://gitee.com/openharmony/filemanagement_dfs_service)
- [filemanagement_user_file_service](https://gitee.com/openharmony/filemanagement_user_file_service)
- [filemanagement_storage_service](https://gitee.com/openharmony/filemanagement_storage_service)
- [filemanagement_app_file_service](https://gitee.com/openharmony/filemanagement_app_file_service)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )