harmony 鸿蒙Copying Files Across Devices
Copying Files Across Devices
The distributed file system provides the cross-device file copy capability for applications. You can use @ohos.file.fs to copy files across devices and applications. This topic walks you through the process of copying a file from device A to device B.
How to Develop
Connect the devices to form a Super Device.
Log in to the same account on two devices and ensure that Bluetooth and Wi-Fi are enabled. Bluetooth does not need to be connected, and Wi-Fi does not need to be connected to the same LAN.Grant the distributed data synchronization permission. Use requestPermissionsFromUser to request user authorization for the ohos.permission.DISTRIBUTED_DATASYNC permission in the form of a dialog box. For details about how to obtain the application context, see Obtaining the Context of UIAbility.
import { common, abilityAccessCtrl } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
// Obtain the context from the component and ensure that the return value of this.getUIContext().getHostContext() is UIAbilityContext.
let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
let atManager = abilityAccessCtrl.createAtManager();
try {
// Request the permission from users in the form of a dialog box.
atManager.requestPermissionsFromUser(context, ['ohos.permission.DISTRIBUTED_DATASYNC']).then((result) => {
console.info(`Request permission result: ${JSON.stringify(result)}`);
}).catch((err: BusinessError) => {
console.error(`Failed to request permissions from user. Code: ${err.code}, message: ${err.message}`);
})
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error(`Catch err. Failed to request permissions from user. Code: ${err.code}, message: ${err.message}`);
}
- Copy files across devices. Place the files in the distributedfiles/ directory of the application sandbox directory to implement file copy from difference devices.
Copy the file of device A from the sandbox directory to the distributedfiles/ directory of device A.
import { fileIo as fs } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { fileUri } from '@kit.CoreFileKit';
// Obtain the context from the component and ensure that the return value of this.getUIContext().getHostContext() is UIAbilityContext.
let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
let pathDir: string = context.filesDir;
let distributedPathDir: string = context.distributedFilesDir;
// Sandbox directory of the file to copy.
let filePath: string = pathDir + '/src.txt';
try {
// Sandbox file to copy.
let file = fs.openSync(filePath, fs.OpenMode.CREATE|fs.OpenMode.READ_WRITE);
fs.writeSync(file.fd, 'Create file success');
fs.closeSync(file);
} catch (error) {
console.error(`Failed to createFile. Code: ${error.code}, message: ${error.message}`);
}
// Obtain the URI of the file to copy.
let srcUri = fileUri.getUriFromPath(filePath);
// Obtain the URI of the destination path (distributed file directory).
let destUri: string = fileUri.getUriFromPath(distributedPathDir + '/src.txt');
try {
// Copy the file from the sandbox directory to the distributed file directory.
fs.copy(srcUri, destUri).then(()=>{
console.info(`Succeeded in copying---. `);
console.info(`src: ${srcUri} dest: ${destUri}`);
}).catch((error: BusinessError)=>{
let err: BusinessError = error as BusinessError;
console.error(`Failed to copy. Code: ${err.code}, message: ${err.message}`);
})
} catch (error) {
console.error(`Catch err. Failed to copy. Code: ${error.code}, message: ${error.message}`);
}
Device B copies the file from the distributed file directory of device B.
import { fileIo as fs } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { fileUri } from '@kit.CoreFileKit';
import { distributedDeviceManager } from '@kit.DistributedServiceKit';
// The context is passed from EntryAbility. Ensure that the return value of this.getUIContext().getHostContext() is UIAbilityContext.
let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
let pathDir: string = context.filesDir;
let distributedPathDir: string = context.distributedFilesDir;
// Destination path (sandbox directory) to which the file is to be copied.
let destPath: string = pathDir + '/dest.txt';
// Obtain the URI of the destination path.
let destUri = fileUri.getUriFromPath(destPath);
// Copy the source file path (distributed file directory).
let srcPath = distributedPathDir + '/src.txt';
// Obtain the URI of the source path.
let srcUri: string = fileUri.getUriFromPath(srcPath);
// Define a callback for the file copy operation.
let progressListener: fs.ProgressListener = (progress: fs.Progress) => {
console.info(`progressSize: ${progress.processedSize}, totalSize: ${progress.totalSize}`);
};
let options: fs.CopyOptions = {
"progressListener" : progressListener
};
// Obtain the network ID of device A by calling distributed device management APIs.
let dmInstance = distributedDeviceManager.createDeviceManager("com.example.hap");
let deviceInfoList: Array<distributedDeviceManager.DeviceBasicInfo> = dmInstance.getAvailableDeviceListSync();
if (deviceInfoList && deviceInfoList.length > 0) {
console.info(`success to get available device list`);
let networkId = deviceInfoList[0].networkId; // Only two devices are connected. The first element in the list is the network ID of device A.
// Define the callback for accessing the distributed file directory.
let listeners : fs.DfsListeners = {
onStatus: (networkId: string, status: number): void => {
console.error(`Failed to access public directory, ${status}`);
}
};
// Start to copy files cross devices.
fs.connectDfs(networkId, listeners).then(()=>{
try {
// Copy the file in the distributed file directory to the destination sandbox directory.
fs.copy(srcUri, destUri, options).then(()=>{
console.info(`Succeeded in copying from distribted path`);
console.info(`src: ${srcUri} dest: ${destUri}`);
fs.unlinkSync(srcPath); // Remove the temporary file in the distributed file directory after the copy is complete.
}).catch((error: BusinessError)=>{
let err: BusinessError = error as BusinessError;
console.error(`Failed to copy. Code: ${err.code}, message: ${err.message}`);
})
} catch (error) {
console.error(`Catch err. Failed to copy. Code: ${error.code}, message: ${error.message}`);
}
}).catch((error: BusinessError) => {
let err: BusinessError = error as BusinessError;
console.error(`Failed to connect dfs. Code: ${err.code}, message: ${err.message}`);
});
}
- Disconnect the link for device B.
import { BusinessError } from '@kit.BasicServicesKit';
import { distributedDeviceManager } from '@kit.DistributedServiceKit'
import { fileIo as fs } from '@kit.CoreFileKit';
// Obtain the network ID of device A.
let dmInstance = distributedDeviceManager.createDeviceManager("com.example.hap");
let deviceInfoList: Array<distributedDeviceManager.DeviceBasicInfo> = dmInstance.getAvailableDeviceListSync();
if (deviceInfoList && deviceInfoList.length > 0) {
console.info(`Success to get available device list`);
let networkId = deviceInfoList[0].networkId; // Only two devices are connected. The first element in the list is the network ID of device A.
// Disable cross-device file copy.
fs.disconnectDfs(networkId).then(() => {
console.info(`Success to disconnect dfs`);
}).catch((error: BusinessError) => {
let err: BusinessError = error as BusinessError;
console.error(`Failed to disconnect dfs. Code: ${err.code}, message: ${err.message}`);
})
}
你可能感兴趣的鸿蒙文章
harmony 鸿蒙Accessing Application Files (ArkTS)
harmony 鸿蒙Accessing Backup and Restore
harmony 鸿蒙Application Data Backup and Restore Overview
harmony 鸿蒙Backup and Restore Triggered by System Applications
harmony 鸿蒙Application File Overview
harmony 鸿蒙Obtaining Application and File System Space Statistics
harmony 鸿蒙Introduction to Core File Kit
harmony 鸿蒙Developing a File Manager Application (for System Applications Only)
- 所属分类: 后端技术
- 本文标签:
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦