打开文件管理器并进行文件夹的复制、移动、删除、创建
- 调文件文件管理器并获取可操作文件的DocumentFile
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
//设置读写权限
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(intent, FILE_OPERATION);
- 通过Intent获取文件的Uri
Uri treeUri = data.getData();
DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
现在已经已经获取到DocumentFile了,可以根据此对文件进行操作
注意:如果是移动和复制的话需要再跳转一次文件管理器,拿到目标文件夹的DocumentFile
使用DocumentFile对文件进行移动,复制,删除,创建
一:复制文件夹
/**
* 拷贝所有的文件
* @param sourceFile 源文件
* @param targetFile 目标文件
*/
public void copyAllFiles(DocumentFile sourceFile, DocumentFile targetFile) {
if (sourceFile.exists() && targetFile.canWrite()) {
//获取源文件下的所有文件
DocumentFile[] documentFiles = sourceFile.listFiles();
for (DocumentFile documentFile1 : documentFiles) {
if (documentFile1.isFile()) {//是文件而不是文件夹或目录
//创建文件,第一个参数是文件类型,第二个是文件名
DocumentFile createFile = targetFile.createFile(documentFile1.getType(), documentFile1.getName());
writeFileByStream(documentFile1, createFile);
} else {
//如果是目录则先获取该文件夹名称
String directoryName = documentFile1.getName();
//创建目录
DocumentFile createDirFile = targetFile.createDirectory(directoryName);
//递归文件目录
copyAllFiles(documentFile1, createDirFile);
}
}
}
}
通过流的方式写入文件
/**
* 通过流的方式写文件
* @param sourceFile 源文件
* @param targetFile 目标文件
*/
private boolean writeFileByStream(DocumentFile sourceFile, DocumentFile targetFile) {
try {
InputStream inputStream = mContext.getContentResolver().openInputStream(sourceFile.getUri());
OutputStream outputStream = mContext.getContentResolver().openOutputStream(targetFile.getUri());
byte[] buffer = new byte[1024];
int byreRead;
while (-1 != (byreRead = inputStream.read(buffer))) {
outputStream.write(buffer, 0, byreRead);
}
inputStream.close();
outputStream.flush();
outputStream.close();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
二:移动文件夹
/**
* 拷贝所有的文件
* @param sourceFile 源文件
* @param targetFile 目标文件
*/
public void moveAllFiles(DocumentFile sourceFile, DocumentFile targetFile) {
if (sourceFile.exists() && targetFile.canWrite()) {
DocumentFile[] documentFiles = sourceFile.listFiles();
for (DocumentFile documentFile1 : documentFiles) {
if (documentFile1.isFile()) {
DocumentFile createFile = targetFile.createFile(documentFile1.getType(), documentFile1.getName());
if(writeFileByStream(documentFile1, createFile)){
//删除源文件
documentFile1.delete();
}
} else {
//如果是目录则先获取该文件夹名称
String directoryName = documentFile1.getName();
//创建目录
DocumentFile createDirFile = targetFile.createDirectory(directoryName);
//递归
moveAllFiles(documentFile1, createDirFile);
//移动成功后删除原文件夹
documentFile1.delete();
}
}
}
}
三:删除文件夹
/**
* 遍历删除所有文件
* @param documentFile 源文件
*/
public void deleteAllFiles(DocumentFile documentFile) {
if (documentFile.exists() && documentFile.canWrite()) {
for(DocumentFile documentFile1 : documentFile.listFiles()){
if (documentFile1.delete()) {
Log.d(TAG, "traversalFiles2Delete: 文件删除成功");
}
}
}
}
四:创建文件夹
DocumentFile documentFile = DocumentFile.fromTreeUri(this, treeUri);
documentFile.createDirectory(directoryName);
主要的实现已经写出来了,如果有什么疑问欢迎到下方留言给我