# ä¿å˜ç”¨æˆ·æ–‡ä»¶ åœ¨ä»Žç½‘ç»œä¸‹è½½æ–‡ä»¶åˆ°æœ¬åœ°ã€æˆ–将已有用户文件å¦å˜ä¸ºæ–°çš„æ–‡ä»¶è·¯å¾„ç‰åœºæ™¯ä¸‹ï¼Œéœ€è¦ä½¿ç”¨FilePickeræä¾›çš„ä¿å˜ç”¨æˆ·æ–‡ä»¶çš„能力。Picker获å–çš„URIåªå…·æœ‰ä¸´æ—¶æƒé™ï¼ŒèŽ·å–æŒä¹…化æƒé™éœ€è¦é€šè¿‡[FilePicker设置永久授æƒ](file-persistPermission.md#通过picker获å–临时授æƒå¹¶è¿›è¡ŒæŽˆæƒæŒä¹…化)æ–¹å¼èŽ·å–。 对音频ã€å›¾ç‰‡ã€è§†é¢‘ã€æ–‡æ¡£ç±»æ–‡ä»¶çš„ä¿å˜æ“作类似,å‡é€šè¿‡è°ƒç”¨å¯¹åº”Pickerçš„save()接å£å¹¶ä¼ 入对应的saveOptionsæ¥å®žçŽ°ã€‚é€šè¿‡Pickerè®¿é—®ç›¸å…³æ–‡ä»¶ï¼Œæ— éœ€ç”³è¯·æƒé™ã€‚ 当剿‰€æœ‰Pickerçš„save接å£éƒ½æ˜¯ç”¨æˆ·å¯æ„ŸçŸ¥çš„,具体行为是拉起FilePicker, 将文件ä¿å˜åœ¨ç³»ç»Ÿæ–‡ä»¶ç®¡ç†å™¨ç®¡ç†çš„特定目录,与图库管ç†çš„资æºéš”ç¦»ï¼Œæ— æ³•åœ¨å›¾åº“ä¸çœ‹åˆ°ã€‚ 如果开å‘者需è¦ä¿å˜å›¾ç‰‡ã€è§†é¢‘资æºåˆ°å›¾åº“,å¯ä½¿ç”¨ç”¨æˆ·æ— 感的[安全控件进行ä¿å˜](../media/medialibrary/photoAccessHelper-savebutton.md)。 ## ä¿å˜å›¾ç‰‡æˆ–视频类文件 [PhotoViewPicker](../reference/apis-core-file-kit/js-apis-file-picker.md#photoviewpicker)在åŽç»ç‰ˆæœ¬ä¸å†æ¼”进,建议使用[Media Library Kitï¼ˆåª’ä½“æ–‡ä»¶ç®¡ç†æœåŠ¡ï¼‰ä¸èƒ½åŠ›æ¥ä¿å˜åª’体库资æº](../media/medialibrary/photoAccessHelper-savebutton.md)。 如果开å‘åœºæ™¯æ— æ³•è°ƒç”¨å®‰å…¨æŽ§ä»¶è¿›è¡Œå›¾ç‰‡ã€è§†é¢‘ä¿å˜ï¼Œå¯ä½¿ç”¨ç›¸å†Œç®¡ç†æ¨¡å—[PhotoAccessHelper.showAssetsCreationDialog](../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#showassetscreationdialog12)接å£è¿›è¡Œä¿å˜æ“作。 ## ä¿å˜æ–‡æ¡£ç±»æ–‡ä»¶ 1. 导入选择器模å—和基础文件API模å—。 ```ts import { picker } from '@kit.CoreFileKit'; import { fileIo as fs } from '@kit.CoreFileKit'; import { BusinessError } from '@kit.BasicServicesKit'; import { common } from '@kit.AbilityKit'; ``` 2. 创建文档ä¿å˜é€‰é¡¹å®žä¾‹ã€‚ ```ts // 创建文件管ç†å™¨é€‰é¡¹å®žä¾‹ const documentSaveOptions = new picker.DocumentSaveOptions(); // ä¿å˜æ–‡ä»¶å(å¯é€‰ï¼‰ documentSaveOptions.newFileNames = ["DocumentViewPicker01.txt"]; // ä¿å˜æ–‡ä»¶ç±»åž‹['åŽç¼€ç±»åž‹æè¿°|åŽç¼€ç±»åž‹'],选择所有文件:'所有文件(*.*)|.*'(å¯é€‰ï¼‰ ,如果选择项å˜åœ¨å¤šä¸ªåŽç¼€ï¼Œé»˜è®¤é€‰æ‹©ç¬¬ä¸€ä¸ªã€‚ documentSaveOptions.fileSuffixChoices = ['文档|.txt', '.pdf']; ``` 3. 创建[文件选择器DocumentViewPicker](../reference/apis-core-file-kit/js-apis-file-picker.md#constructor12)实例。调用[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save)æŽ¥å£æ‹‰èµ·FilePicker界é¢è¿›è¡Œæ–‡ä»¶ä¿å˜ã€‚ ```ts let uris: Array<string> = []; // è¯·ç¡®ä¿ getContext(this) 返回结果为 UIAbilityContext let context = getContext(this) as common.Context; // 创建文件选择器实例。 const documentViewPicker = new picker.DocumentViewPicker(context); //ç”¨æˆ·é€‰æ‹©ç›®æ ‡æ–‡ä»¶å¤¹ï¼Œç”¨æˆ·é€‰æ‹©ä¸Žæ–‡ä»¶ç±»åž‹ç›¸å¯¹åº”çš„æ–‡ä»¶å¤¹ï¼Œå³å¯å®Œæˆæ–‡ä»¶ä¿å˜æ“作。ä¿å˜æˆåŠŸåŽï¼Œè¿”回ä¿å˜æ–‡æ¡£çš„URI。 documentViewPicker.save(documentSaveOptions).then((documentSaveResult: Array<string>) => { uris = documentSaveResult; console.info('documentViewPicker.save to file succeed and uris are:' + uris); }).catch((err: BusinessError) => { console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`); }) ``` > **注æ„**: > > 1ã€å»ºè®®ä¸åœ¨Picker的回调里直接使用æ¤URI进行打开文件æ“作,需è¦å®šä¹‰ä¸€ä¸ªå…¨å±€å˜é‡ä¿å˜URI。 > 2ã€ä½¿ç”¨Pickerçš„[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save)接å£èŽ·å–到URIçš„æƒé™æ˜¯ä¸´æ—¶è¯»å†™æƒé™,待退出应用åŽå°åŽï¼ŒèŽ·å–的临时æƒé™å°±ä¼šå¤±æ•ˆã€‚ > 3ã€å¦‚果想è¦èŽ·å–æŒä¹…化æƒé™(仅在2in1设备上生效),请å‚考[文件æŒä¹…化授æƒè®¿é—®](file-persistPermission.md#通过picker获å–临时授æƒå¹¶è¿›è¡ŒæŽˆæƒæŒä¹…化)。 > 4ã€å¯ä»¥é€šè¿‡ä¾¿æ·æ–¹å¼ï¼Œç›´æŽ¥å°†æ–‡ä»¶ä¿å˜åˆ°[Download](#download模å¼ä¿å˜æ–‡ä»¶)目录下。 4. 待界é¢ä»ŽFilePicker返回åŽï¼Œä½¿ç”¨[基础文件APIçš„fs.openSync](../reference/apis-core-file-kit/js-apis-file-fs.md#fsopensync)接å£ï¼Œé€šè¿‡URI打开这个文件得到文件æè¿°ç¬¦(fd)。 ```ts const uri = ''; //è¿™é‡Œéœ€è¦æ³¨æ„æŽ¥å£æƒé™å‚数是fs.OpenMode.READ_WRITE。 let file = fs.openSync(uri, fs.OpenMode.READ_WRITE); console.info('file fd: ' + file.fd); ``` 5. 通过(fd)使用[基础文件APIçš„fs.writeSync](../reference/apis-core-file-kit/js-apis-file-fs.md#writesync)接å£å¯¹è¿™ä¸ªæ–‡ä»¶è¿›è¡Œç¼–辑修改,编辑修改完æˆåŽå…³é—(fd)。 ```ts let writeLen: number = fs.writeSync(file.fd, 'hello, world'); console.info('write data to file succeed and size is:' + writeLen); fs.closeSync(file); ``` ## ä¿å˜éŸ³é¢‘类文件 1. 导入选择器模å—和基础文件API模å—。 ```ts import { picker } from '@kit.CoreFileKit'; import { fileIo as fs } from '@kit.CoreFileKit'; import { BusinessError } from '@kit.BasicServicesKit'; import { common } from '@kit.AbilityKit'; ``` 2. 创建音频ä¿å˜é€‰é¡¹å®žä¾‹ã€‚ ```ts // 创建文件管ç†å™¨é€‰é¡¹å®žä¾‹ const audioSaveOptions = new picker.AudioSaveOptions(); // ä¿å˜æ–‡ä»¶å(å¯é€‰ï¼‰ audioSaveOptions.newFileNames = ['AudioViewPicker01.mp3']; ``` 3. 创建[音频选择器AudioViewPicker](../reference/apis-core-file-kit/js-apis-file-picker.md#audioviewpicker)实例。调用[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save-5)æŽ¥å£æ‹‰èµ·FilePicker界é¢è¿›è¡Œæ–‡ä»¶ä¿å˜ã€‚ ```ts let uri: string = ''; // è¯·ç¡®ä¿ getContext(this) 返回结果为 UIAbilityContext let context = getContext(this) as common.Context; const audioViewPicker = new picker.AudioViewPicker(context); //ç”¨æˆ·é€‰æ‹©ç›®æ ‡æ–‡ä»¶å¤¹ï¼Œç”¨æˆ·é€‰æ‹©ä¸Žæ–‡ä»¶ç±»åž‹ç›¸å¯¹åº”çš„æ–‡ä»¶å¤¹ï¼Œå³å¯å®Œæˆæ–‡ä»¶ä¿å˜æ“作。ä¿å˜æˆåŠŸåŽï¼Œè¿”回ä¿å˜æ–‡æ¡£çš„uri。 audioViewPicker.save(audioSaveOptions).then((audioSelectResult: Array<string>) => { uri = audioSelectResult[0]; console.info('audioViewPicker.save to file succeed and uri is:' + uri); }).catch((err: BusinessError) => { console.error(`Invoke audioViewPicker.save failed, code is ${err.code}, message is ${err.message}`); }) ``` > **注æ„**: > 1ã€å»ºè®®ä¸åœ¨Picker的回调里直接使用æ¤URI进行打开文件æ“作,需è¦å®šä¹‰ä¸€ä¸ªå…¨å±€å˜é‡ä¿å˜URI。 > 2ã€ä½¿ç”¨Picker获å–çš„[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save-3)URIæƒé™æ˜¯ä¸´æ—¶è¯»å†™æƒé™,待退出应用åŽå°åŽï¼ŒèŽ·å–的临时æƒé™å°±ä¼šå¤±æ•ˆã€‚ > 3ã€å¦‚果想è¦èŽ·å–æŒä¹…化æƒé™(仅在2in1设备上生效),请å‚考[文件æŒä¹…化授æƒè®¿é—®](file-persistPermission.md#通过picker获å–临时授æƒå¹¶è¿›è¡ŒæŽˆæƒæŒä¹…化)。 > 4ã€å¯ä»¥é€šè¿‡ä¾¿æ·æ–¹å¼ï¼Œç›´æŽ¥å°†æ–‡ä»¶ä¿å˜åˆ°[Download](#download模å¼ä¿å˜æ–‡ä»¶)目录下。 4. 待界é¢ä»ŽFilePicker返回åŽï¼Œå¯ä»¥ä½¿ç”¨[基础文件APIçš„fs.openSync](../reference/apis-core-file-kit/js-apis-file-fs.md#fsopensync)接å£ï¼Œé€šè¿‡URI打开这个文件得到文件æè¿°ç¬¦(fd)。 ```ts //è¿™é‡Œéœ€è¦æ³¨æ„æŽ¥å£æƒé™å‚数是fileIo.OpenMode.READ_WRITE。 let file = fs.openSync(uri, fs.OpenMode.READ_WRITE); console.info('file fd: ' + file.fd); ``` 5. 通过(fd)使用[基础文件APIçš„fs.writeSync](../reference/apis-core-file-kit/js-apis-file-fs.md#writesync)接å£å¯¹è¿™ä¸ªæ–‡ä»¶è¿›è¡Œç¼–辑修改,编辑修改完æˆåŽå…³é—(fd)。 ```ts let writeLen = fs.writeSync(file.fd, 'hello, world'); console.info('write data to file succeed and size is:' + writeLen); fs.closeSync(file); ``` ## DOWNLOAD模å¼ä¿å˜æ–‡ä»¶ 用户在使用saveæŽ¥å£æ—¶ï¼Œå¯ä»¥å°†pickerModeé…置为DOWNLOAD模å¼ï¼Œè¯¥æ¨¡å¼ä¸‹ä¼šåœ¨å…¬å…±è·¯å¾„download目录下创建用户当å‰hap包å的文件夹,并通过save接å£è¿”å›žå€¼å›žä¼ ç›¸åº”çš„URI,åŽç»ç”¨æˆ·å¯ä»¥ç›´æŽ¥å°†æ–‡ä»¶ä¿å˜åœ¨è¯¥URI下。 1. 导入选择器模å—å’Œæ–‡ä»¶ç®¡ç†æ¨¡å—。 ```ts import { picker } from '@kit.CoreFileKit'; import { fileIo as fs } from '@kit.CoreFileKit'; import { BusinessError } from '@kit.BasicServicesKit'; import { common } from '@kit.AbilityKit'; ``` 2. 创建文件ä¿å˜é€‰é¡¹å®žä¾‹ã€‚ ```ts // 创建文件管ç†å™¨é€‰é¡¹å®žä¾‹ const documentSaveOptions = new picker.DocumentSaveOptions(); // é…ç½®ä¿å˜çš„æ¨¡å¼ä¸ºDOWNLOAD,若é…置了DOWNLOAD模å¼ï¼Œæ¤æ—¶é…置的其他documentSaveOptions傿•°å°†ä¸ä¼šç”Ÿæ•ˆã€‚ documentSaveOptions.pickerMode = picker.DocumentPickerMode.DOWNLOAD; ``` 3. 创建文件选择器实例。调用[save()](../reference/apis-core-file-kit/js-apis-file-picker.md#save-1)æŽ¥å£æ‹‰èµ·FilePicker模æ€çª—界é¢è¿›è¡Œæ–‡ä»¶ä¿å˜ã€‚ç”¨æˆ·ç‚¹å‡»åŒæ„,å³å¯åœ¨download目录下创建对应应用的专属目录,返回该目录的URI。 ```ts let uri: string = ''; // è¯·ç¡®ä¿ getContext(this) 返回结果为 UIAbilityContext let context = getContext(this) as common.Context; const documentViewPicker = new picker.DocumentViewPicker(context); const documentSaveOptions = new picker.DocumentSaveOptions(); documentSaveOptions.pickerMode = picker.DocumentPickerMode.DOWNLOAD; documentViewPicker.save(documentSaveOptions ).then((documentSaveResult: Array<string>) => { uri = documentSaveResult[0]; console.info('documentViewPicker.save succeed and uri is:' + uri); }).catch((err: BusinessError) => { console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`); }) ```