1# 文件子系统ChangeLog
2
3## cl.file.1 mediaLibrary相关接口支持范围兼容性变更
4
5[mediaLibrary](../../../application-dev/reference/apis/js-apis-medialibrary.md)部分接口支持范围兼容性变更。
6
71. 因文件子系统目录框架调整,开发者在访问文档类目录(Documents、Download)不应再使用媒体库(mediaLibrary)的接口,建议使用[FilePicker](../../../application-dev/reference/apis/js-apis-file-picker.md)接口替代。
8
9- 调整前属于媒体库管控的目录有:
10
11  相机(Camera)、视频(Videos)、图片(Pictures)、音频(Audios)、文档(Documents、Download)。
12
13- 调整后属于媒体库管控的目录有:
14
15  相机(Camera)、视频(Videos)、图片(Pictures)、音频(Audios)。
16
172. 对应的资源uri格式发生变化,参见:[文件子系统ChangeLog](../OpenHarmony_4.0.11.2/changelogs-filemanagement.md)。
18
19**变更影响**
20
21基于此前版本开发的应用,请排查是否有通过调用媒体库接口对文档类目录(Documents、Download)和目录下的文件进行操作的情况,如有请尽快进行适配修改。
22
23**关键接口/组件变更**
24
25| 模块名                    | 方法/属性/枚举/常量                                          | 变更类型 |
26| ------------------------- | ------------------------------------------------------------ | -------- |
27| medialibrary   |  **function** getFileAssets(options: MediaFetchOptions, callback: AsyncCallback<FetchFileResult>): void | 接口支持范围兼容性变更     |
28| medialibrary   |  **function** getFileAssets(options: MediaFetchOptions): Promise<FetchFileResult> | 接口支持范围兼容性变更     |
29| medialibrary   |  **function** createAsset(mediaType: MediaType, displayName: string, relativePath: string, callback: AsyncCallback<FileAsset>): void | 接口支持范围兼容性变更     |
30| medialibrary   |  **function** createAsset(mediaType: MediaType, displayName: string, relativePath: string): Promise<FileAsset> | 接口支持范围兼容性变更     |
31| medialibrary   |  **function** deleteAsset(uri: string, callback: AsyncCallback<void>): void | 接口支持范围兼容性变更     |
32| medialibrary   |  **function** deleteAsset(uri: string): Promise<void> | 接口支持范围兼容性变更     |
33| medialibrary   |  **function** getPublicDirectory(type: DirectoryType, callback: AsyncCallback<string>): void | 接口支持范围兼容性变更     |
34| medialibrary   |  **function** getPublicDirectory(type: DirectoryType): Promise<string> | 接口支持范围兼容性变更     |
35| medialibrary   |  **function** storeMediaAsset(option: MediaAssetOption, callback: AsyncCallback<string>): void | 接口支持范围兼容性变更     |
36| medialibrary   |  **function** storeMediaAsset(option: MediaAssetOption): Promise<string> | 接口支持范围兼容性变更     |
37| medialibrary   |  **interface** DirectoryType | 接口支持范围兼容性变更     |
38| medialibrary   |  **interface** MediaAssetOption | 接口支持范围兼容性变更     |
39
40**getFileAssets接口支持范围兼容性变更影响:**
41
42由于API version 10上文件子系统目录框架调整,getFileAssets将无法获取到文档类目录(Documents、Download)下的文件资源。推荐使用[FilePicker](../../../application-dev/reference/apis/js-apis-file-picker.md)获取文件资源。
43
44**createAsset接口支持范围兼容性变更影响:**
45
46由于API version 10上文件子系统目录框架调整,createAsset接口参数中relativePath填写文档类目录(Documents、Download)及其以下的路径将无法在对应目录下创建文件资源。推荐使用[FilePicker](../../../application-dev/reference/apis/js-apis-file-picker.md)创建文件资源。
47
48**deleteAsset接口支持范围兼容性变更影响:**
49
50由于API version 10上文件子系统目录框架调整,deleteAsset接口参数中uri指向的是文档类目录(Documents、Download)下的文件资源将无法删除对应文件资源。推荐使用[fileAccess.delete](../../../application-dev/reference/apis/js-apis-fileAccess.md)删除文件资源
51
52**getPublicDirectory接口支持范围兼容性变更影响:**
53
54由于API version 10上文件子系统目录框架调整,getPublicDirectory接口参数中type填写mediaLibrary.DirectoryType.DIR_DOCUMENTSmediaLibrary.DirectoryType.DIR_DOWNLOAD将无法获取对应的公共目录路径。
55
56**storeMediaAsset接口支持范围兼容性变更影响:**
57
58由于API version 10上文件子系统目录框架调整,storeMediaAsset接口参数中MediaAssetOption.relativePath填写文档类目录(Documents、Download)及其以下的路径将无法在对应目录下保存创建文件资源。推荐使用[FilePicker](../../../application-dev/reference/apis/js-apis-file-picker.md)保存文件资源。
59
60**DirectoryType接口支持范围兼容性变更影响:**
61
62由于API version 10上文件子系统目录框架调整,DirectoryType属性中mediaLibrary.DirectoryType.DIR_DOCUMENTSmediaLibrary.DirectoryType.DIR_DOWNLOAD表示的目录类型不再归媒体库管控,请不要继续使用此目录类型。
63
64**MediaAssetOption接口支持范围兼容性变更影响:**
65
66由于API version 10上文件子系统目录框架调整,MediaAssetOption属性中relativePath填写文档类目录(Documents、Download)及其以下的路径在使用storeMediaAsset接口保存文件时将无法保存,请不要在填写与其相关的路径。
67
68**适配指导**
69
70在API version 10上,对文件子系统目录框架调整,文档类目录(Documents、Download)和此目录下的文件不再属于媒体库管控。继续通过媒体库接口对其进行操作会存在无法达到预期效果的情况,推荐使用[FilePicker](../../../application-dev/reference/apis/js-apis-file-picker.md)对文档类目录(Documents、Download)下的文件进行文件选择和保存等操作。
71
72![fileAccessView](figures/fileAccessView.png)
73
74以下为典型的场景适配指导和示例:
75
76**变更前,使用mediaLibrary接口编辑公共目录下的文件示例(公共目录Documents和Download后续不支持):**
77
781. 使用getMediaLibrary接口获取媒体库实例。
792. 创建MediaFetchOptions检索条件使用mediaLibrary实例调用getFileAssets接口获取公共目录下的文件。
803. 使用FetchFileResult相应接口获取目的文件的fileAsset。
814. 使用fileAsset.open接口打开这个文件得到fd。
825. 通过fd使用[fs.writeSync](../../../application-dev/reference/apis/js-apis-file-fs.md#writesync)接口对这个文件进行编辑修改。
836. 修改完成后使用fileAsset.close接口关闭这个文件的fd。
847. 使用fetchFileResult.close接口释放getFileAssets时占用的资源。
858. 使用release接口释放媒体库实例。
86
87**示例:**
88
89```js
90import mediaLibrary from '@ohos.multimedia.mediaLibrary';
91import fs from '@ohos.file.fs';
92
93async function example() {
94  try {
95    let context = getContext(this);
96    let media = mediaLibrary.getMediaLibrary(context);
97    let fileKeyObj = mediaLibrary.FileKey;
98    let imageType = mediaLibrary.MediaType.IMAGE;
99    let getImageOp = {
100      selections: fileKeyObj.MEDIA_TYPE + '= ?',
101      selectionArgs: [imageType.toString()],
102      order: fileKeyObj.DATE_ADDED + ' DESC',
103    };
104    const fetchFileResult = await media.getFileAssets(getImageOp);
105    const fileAsset = await fetchFileResult.getFirstObject();
106    console.info('mediaLibrary fileAsset displayName: ' + fileAsset.displayName);
107    let fd = await fileAsset.open('rw');
108    console.info('mediaLibrary fileAsset open fd: ' + fd);
109    let writeLen = fs.writeSync(fd, 'hello, world');
110    console.info('write data to file succeed and size is: ' + writeLen);
111    fileAsset.close(fd);
112    fetchFileResult.close();
113    media.release();
114  } catch (err) {
115    console.error('mediaLibrary fail, err: ' + err);
116  }
117}
118```
119
120**变更后,使用FilePicker编辑公共目录下的文件示例:**
121
1221. 获取DocumentViewPicker文件选择器对象。
1232. 拉起DocumentViewPicker.select接口选择目的文件。
1243. 用户选择完后返回目的文件的uri。
1254. 待界面从DocumentViewPicker返回后在其他函数中使用[fs.openSync](../../../application-dev/reference/apis/js-apis-file-fs.md#fsopensync)接口通过uri打开这个文件得到fd。
1265. 通过fd使用[fs.writeSync](../../../application-dev/reference/apis/js-apis-file-fs.md#writesync)接口对这个文件进行编辑修改。
1276. 编辑修改完毕后使用[fs.closeSync](../../../application-dev/reference/apis/js-apis-file-fs.md#closesync)接口关闭这个fd。
128
129**示例:**
130
131```js
132import picker from '@ohos.file.picker';
133import fs from '@ohos.file.fs';
134
135let uri;
136
137async function example() {
138  try {
139    let DocumentSelectOptions = new picker.DocumentSelectOptions();
140    let documentPicker = new picker.DocumentViewPicker();
141    documentPicker.select(DocumentSelectOptions).then((DocumentSelectResult) => {
142      console.info('DocumentViewPicker.select successfully, DocumentSelectResult uri: ' + JSON.stringify(DocumentSelectResult));
143      uri = DocumentSelectResult[0];
144    }).catch((err) => {
145      console.error('DocumentViewPicker.select failed with err: ' + err);
146    });
147  } catch (err) {
148    console.error('DocumentViewPicker failed with err: ' + err);
149  }
150}
151
152async function writeFile() {
153  try {
154    let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);
155    console.info('DocumentViewPicker file fd: ' + file.fd);
156    let writeLen = fs.writeSync(file.fd, 'hello, world');
157    console.info('write data to file succeed and size is: ' + writeLen);
158    fs.closeSync(file);
159  } catch (err) {
160    console.error('DocumentViewPicker fail, err: ' + err);
161  }
162}
163```
164
165**变更前,使用mediaLibrary接口在公共目录下创建文件示例(公共目录Documents和Download后续不支持):**
166
1671. 使用getMediaLibrary接口获取媒体库实例。
1682. 使用getPublicDirectory接口获取公共目录路径。
1693. 使用createAsset接口创建文件得到这个文件的fileAsset。
1704. 使用fileAsset.open接口打开这个文件得到fd。
1715. 通过fd使用fs.write接口对这个文件进行编辑修改。
1726. 修改完成后使用fileAsset.close接口关闭这个文件的fd。
1737. 使用release接口释放媒体库实例。
174
175**示例:**
176
177```js
178import mediaLibrary from '@ohos.multimedia.mediaLibrary';
179import fs from '@ohos.file.fs';
180
181async function example() {
182  try {
183    let context = getContext(this);
184    let media = mediaLibrary.getMediaLibrary(context);
185    let mediaType = mediaLibrary.MediaType.FILE;
186    let DIR_DOWNLOAD = mediaLibrary.DirectoryType.DIR_DOWNLOAD;
187    const path = await media.getPublicDirectory(DIR_DOWNLOAD);
188    const fileAsset = await media.createAsset(mediaType, 'test.txt', path);
189    console.info('mediaLibrary fileAsset displayName: ' + fileAsset.displayName);
190    let fd = await fileAsset.open('rw');
191    console.info('mediaLibrary fileAsset open fd: ' + fd);
192    let writeLen = fs.writeSync(fd, 'hello, world');
193    console.info('write data to file succeed and size is: ' + writeLen);
194    fileAsset.close(fd);
195    media.release();
196  } catch (err) {
197    console.error('mediaLibrary fail, err: ' + err);
198  }
199}
200```
201
202**变更后,使用FilePicker在公共目录下创建文件示例:**
203
2041. 获取DocumentViewPicker文件选择器对象。
2052. 拉起DocumentViewPicker.save接口创建保存一个空的文件。
2063. 用户保存完后返回目的文件的uri。
2074. 待界面从DocumentViewPicker返回后在其他函数中使用[fs.openSync](../../../application-dev/reference/apis/js-apis-file-fs.md#fsopensync)接口通过uri打开这个文件得到fd。
2085. 通过fd使用[fs.writeSync](../../../application-dev/reference/apis/js-apis-file-fs.md#writesync)接口对这个文件进行编辑修改。
2096. 编辑修改完毕后使用[fs.closeSync](../../../application-dev/reference/apis/js-apis-file-fs.md#closesync)接口关闭这个fd。
210
211**示例:**
212
213```js
214import picker from '@ohos.file.picker';
215import fs from '@ohos.file.fs';
216
217let uri;
218
219async function example() {
220  try {
221    let DocumentSaveOptions = new picker.DocumentSaveOptions();
222    DocumentSaveOptions.newFileNames = ['DocumentViewPicker01.txt'];
223    let documentPicker = new picker.DocumentViewPicker();
224    documentPicker.save(DocumentSaveOptions).then((DocumentSaveResult) => {
225      console.info('DocumentViewPicker.save successfully, DocumentSaveResult uri: ' + JSON.stringify(DocumentSaveResult));
226      uri = DocumentSaveResult[0];
227    }).catch((err) => {
228      console.error('DocumentViewPicker.save failed with err: ' + err);
229    });
230  } catch (err) {
231    console.error('DocumentViewPicker failed with err: ' + err);
232  }
233}
234
235async function writeFile() {
236  try {
237    let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);
238    console.info('DocumentViewPicker file fd: ' + file.fd);
239    let writeLen = fs.writeSync(file.fd, 'hello, world');
240    console.info('write data to file succeed and size is: ' + writeLen);
241    fs.closeSync(file);
242  } catch (err) {
243    console.error('DocumentViewPicker fail, err: ' + err);
244  }
245}
246```
247