Localbook实现导入压缩文件

This commit is contained in:
Xwite
2023-03-16 14:31:35 +08:00
parent 37f974e66b
commit 482f65b867
6 changed files with 18 additions and 18 deletions
@@ -534,7 +534,7 @@ class BookInfoActivity :
} else if (webFile.isSupportDecompress) { } else if (webFile.isSupportDecompress) {
/* 解压筛选后再选择导入项 */ /* 解压筛选后再选择导入项 */
viewModel.importOrDownloadWebFile<Uri>(webFile) { uri -> viewModel.importOrDownloadWebFile<Uri>(webFile) { uri ->
viewModel.getArchiveEntriesName(uri) { fileNames -> viewModel.getArchiveFilesName(uri) { fileNames ->
if (fileNames.size == 1) { if (fileNames.size == 1) {
viewModel.importArchiveBook(uri, fileNames[0]) { viewModel.importArchiveBook(uri, fileNames[0]) {
onClick?.invoke(it) onClick?.invoke(it)
@@ -289,7 +289,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
} }
} }
fun getArchiveEntriesName(archiveFileUri: Uri, onSuccess: (List<String>) -> Unit) { fun getArchiveFilesName(archiveFileUri: Uri, onSuccess: (List<String>) -> Unit) {
execute { execute {
ArchiveUtils.getArchiveFilesName(archiveFileUri) { ArchiveUtils.getArchiveFilesName(archiveFileUri) {
AppPattern.bookFileRegex.matches(it) AppPattern.bookFileRegex.matches(it)
@@ -71,7 +71,7 @@ object ArchiveUtils {
} }
/* 遍历目录获取文件名 */ /* 遍历目录获取文件名 */
fun getArchiveFilesName(fileUri: Uri, filter: ((String) -> Boolean)? = null): List<String> = getArchiveEntriesName(FileDoc.fromUri(fileUri, false), filter) fun getArchiveFilesName(fileUri: Uri, filter: ((String) -> Boolean)? = null): List<String> = getArchiveFilesName(FileDoc.fromUri(fileUri, false), filter)
fun getArchiveFilesName( fun getArchiveFilesName(
fileDoc: FileDoc, fileDoc: FileDoc,
@@ -82,19 +82,13 @@ object ArchiveUtils {
return fileDoc.openInputStream().getOrThrow().use { return fileDoc.openInputStream().getOrThrow().use {
when { when {
name.endsWith(".rar", ignoreCase = true) -> { name.endsWith(".rar", ignoreCase = true) -> {
RarUtils.getFilesName(it) { RarUtils.getFilesName(it, filter)
filter?.invoke(it)
}
} }
name.endsWith(".zip", ignoreCase = true) -> { name.endsWith(".zip", ignoreCase = true) -> {
ZipUtils.getFilesName(it) { ZipUtils.getFilesName(it, filter)
filter?.invoke(it)
}
} }
name.endsWith(".7z", ignoreCase = true) -> { name.endsWith(".7z", ignoreCase = true) -> {
SevenZipUtils.getFilesName(it) { SevenZipUtils.getFilesName(it, filter)
filter?.invoke(it)
}
} }
else -> emptyList() else -> emptyList()
} }
@@ -113,13 +113,15 @@ object RarUtils {
archive: Archive, archive: Archive,
filter: ((String) -> Boolean)? = null filter: ((String) -> Boolean)? = null
): List<String> { ): List<String> {
val fileNames = mutableList<String>() val fileNames = mutableListOf<String>()
var entry: FileHeader? var entry: FileHeader?
while (archive.nextFileHeader().also { entry = it } != null) { while (archive.nextFileHeader().also { entry = it } != null) {
if (entry!!.isDirectory) { if (entry!!.isDirectory) {
continue continue
} }
fileNames.add(entry!!.fileName) val fileName = entry!!.fileName
if (filter != null && filter.invoke(fileName))
fileNames.add(fileName)
} }
return fileNames return fileNames
} }
@@ -116,13 +116,15 @@ object SevenZipUtils {
sevenZFile: SevenZFile, sevenZFile: SevenZFile,
filter: ((String) -> Boolean)? = null filter: ((String) -> Boolean)? = null
): List<String> { ): List<String> {
val fileNames = mutableList<String>() val fileNames = mutableListOf<String>()
var entry: SevenZArchiveEntry? var entry: SevenZArchiveEntry?
while (sevenZFile.nextEntry.also { entry = it } != null) { while (sevenZFile.nextEntry.also { entry = it } != null) {
if (entry!!.isDirectory) { if (entry!!.isDirectory) {
continue continue
} }
fileNames.add(entry!!.name) val fileName = entry!!.name
if (filter != null && filter.invoke(fileName))
fileNames.add(fileName)
} }
return fileNames return fileNames
} }
@@ -259,13 +259,15 @@ object ZipUtils {
zipInputStream: ZipArchiveInputStream, zipInputStream: ZipArchiveInputStream,
filter: ((String) -> Boolean)? = null filter: ((String) -> Boolean)? = null
): List<String> { ): List<String> {
val fileNames = mutableList<String>() val fileNames = mutableListOf<String>()
var entry: ArchiveEntry? var entry: ArchiveEntry?
while (zipInputStream.nextEntry.also { entry = it } != null) { while (zipInputStream.nextEntry.also { entry = it } != null) {
if (entry!!.isDirectory) { if (entry!!.isDirectory) {
continue continue
} }
fileNames.add(entry!!.name) val fileName = entry!!.name
if (filter != null && filter.invoke(fileName))
fileNames.add(fileName)
} }
return fileNames return fileNames
} }