mirror of
https://github.com/gedoor/legado.git
synced 2024-08-30 09:23:26 +08:00
初步实现RAR,7ZIP解压
This commit is contained in:
parent
fe646575c0
commit
f429924e8f
@ -135,7 +135,7 @@ android {
|
|||||||
dependencies {
|
dependencies {
|
||||||
compileOnly "com.android.tools.build:gradle:$agp_version"
|
compileOnly "com.android.tools.build:gradle:$agp_version"
|
||||||
//noinspection GradleDependency,GradlePackageUpdate
|
//noinspection GradleDependency,GradlePackageUpdate
|
||||||
coreLibraryDesugaring('com.android.tools:desugar_jdk_libs:2.0.2')
|
coreLibraryDesugaring('com.android.tools:desugar_jdk_libs_nio:2.0.2')
|
||||||
testImplementation('junit:junit:4.13.2')
|
testImplementation('junit:junit:4.13.2')
|
||||||
androidTestImplementation('androidx.test:runner:1.5.2')
|
androidTestImplementation('androidx.test:runner:1.5.2')
|
||||||
androidTestImplementation('androidx.test.espresso:espresso-core:3.5.1')
|
androidTestImplementation('androidx.test.espresso:espresso-core:3.5.1')
|
||||||
@ -231,6 +231,10 @@ dependencies {
|
|||||||
|
|
||||||
//apache
|
//apache
|
||||||
implementation('org.apache.commons:commons-text:1.10.0')
|
implementation('org.apache.commons:commons-text:1.10.0')
|
||||||
|
implementation 'org.apache.commons:commons-compress:1.22'
|
||||||
|
|
||||||
|
//RAR
|
||||||
|
implementation 'com.github.junrar:junrar:7.5.4'
|
||||||
|
|
||||||
//MarkDown
|
//MarkDown
|
||||||
def markwonVersion = "4.6.2"
|
def markwonVersion = "4.6.2"
|
||||||
|
@ -564,6 +564,7 @@ interface JsExtensions : JsEncodeUtils {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//******************文件操作************************//
|
//******************文件操作************************//
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -0,0 +1,79 @@
|
|||||||
|
package io.legado.app.utils
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.os.ParcelFileDescriptor
|
||||||
|
import android.system.ErrnoException
|
||||||
|
import android.system.Os
|
||||||
|
import android.system.OsConstants
|
||||||
|
import java.io.IOException
|
||||||
|
import java.nio.ByteBuffer
|
||||||
|
import java.nio.channels.SeekableByteChannel
|
||||||
|
|
||||||
|
@SuppressLint("NewApi")
|
||||||
|
class ParcelFileDescriptorChannel(private val pfd: ParcelFileDescriptor) : SeekableByteChannel {
|
||||||
|
@Throws(IOException::class)
|
||||||
|
override fun read(dst: ByteBuffer): Int {
|
||||||
|
return try {
|
||||||
|
Os.read(pfd.fileDescriptor, dst)
|
||||||
|
} catch (e: ErrnoException) {
|
||||||
|
throw RuntimeException(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Throws(IOException::class)
|
||||||
|
override fun write(src: ByteBuffer): Int {
|
||||||
|
return try {
|
||||||
|
Os.write(pfd.fileDescriptor, src)
|
||||||
|
} catch (e: ErrnoException) {
|
||||||
|
throw RuntimeException(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Throws(IOException::class)
|
||||||
|
override fun position(): Long {
|
||||||
|
return try {
|
||||||
|
Os.lseek(pfd.fileDescriptor, 0, OsConstants.SEEK_CUR)
|
||||||
|
} catch (e: ErrnoException) {
|
||||||
|
throw RuntimeException(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Throws(IOException::class)
|
||||||
|
override fun position(newPosition: Long): SeekableByteChannel {
|
||||||
|
try {
|
||||||
|
Os.lseek(pfd.fileDescriptor, newPosition, OsConstants.SEEK_SET)
|
||||||
|
} catch (e: ErrnoException) {
|
||||||
|
throw RuntimeException(e)
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
@Throws(IOException::class)
|
||||||
|
override fun size(): Long {
|
||||||
|
return try {
|
||||||
|
Os.fstat(pfd.fileDescriptor).st_size
|
||||||
|
} catch (e: ErrnoException) {
|
||||||
|
throw RuntimeException(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Throws(IOException::class)
|
||||||
|
override fun truncate(newSize: Long): SeekableByteChannel {
|
||||||
|
require(!(newSize < 0L || newSize > Int.MAX_VALUE)) { "Size has to be in range 0.. " + Int.MAX_VALUE }
|
||||||
|
try {
|
||||||
|
Os.ftruncate(pfd.fileDescriptor, newSize)
|
||||||
|
} catch (e: ErrnoException) {
|
||||||
|
throw RuntimeException(e)
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun isOpen(): Boolean {
|
||||||
|
return pfd.fileDescriptor.valid()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Throws(IOException::class)
|
||||||
|
override fun close() {
|
||||||
|
pfd.close()
|
||||||
|
}
|
||||||
|
}
|
37
app/src/main/java/io/legado/app/utils/RarUtils.kt
Normal file
37
app/src/main/java/io/legado/app/utils/RarUtils.kt
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package io.legado.app.utils
|
||||||
|
|
||||||
|
import com.github.junrar.Archive
|
||||||
|
import com.github.junrar.rarfile.FileHeader
|
||||||
|
import java.io.File
|
||||||
|
import java.io.FileOutputStream
|
||||||
|
import java.io.InputStream
|
||||||
|
@Suppress("unused")
|
||||||
|
object RarUtils {
|
||||||
|
fun unRarToPath(inputStream: InputStream, path: String){
|
||||||
|
val archive= Archive(inputStream)
|
||||||
|
var entry: FileHeader
|
||||||
|
while (archive.nextFileHeader().also { entry=it }!=null){
|
||||||
|
val entryFile = File(path, entry.fileName)
|
||||||
|
if (entry.isDirectory) {
|
||||||
|
if (!entryFile.exists()) {
|
||||||
|
entryFile.mkdirs()
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (entryFile.parentFile?.exists() != true) {
|
||||||
|
entryFile.parentFile?.mkdirs()
|
||||||
|
}
|
||||||
|
if (!entryFile.exists()) {
|
||||||
|
entryFile.createNewFile()
|
||||||
|
entryFile.setReadable(true)
|
||||||
|
entryFile.setExecutable(true)
|
||||||
|
}
|
||||||
|
FileOutputStream(entryFile).use {
|
||||||
|
archive.getInputStream(entry).copyTo(it)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
inputStream.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
55
app/src/main/java/io/legado/app/utils/SevenZipUtils.kt
Normal file
55
app/src/main/java/io/legado/app/utils/SevenZipUtils.kt
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
package io.legado.app.utils
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.os.ParcelFileDescriptor
|
||||||
|
import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry
|
||||||
|
import org.apache.commons.compress.archivers.sevenz.SevenZFile
|
||||||
|
import org.apache.commons.compress.utils.SeekableInMemoryByteChannel
|
||||||
|
import java.io.File
|
||||||
|
import java.io.FileOutputStream
|
||||||
|
import java.io.InputStream
|
||||||
|
import java.nio.channels.FileChannel
|
||||||
|
@Suppress("unused")
|
||||||
|
object SevenZipUtils {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
fun un7zToPath(inputStream: InputStream, path: String){
|
||||||
|
un7zToPath(SevenZFile(SeekableInMemoryByteChannel(inputStream.readBytes())),path)
|
||||||
|
}
|
||||||
|
fun un7zToPath(pfd: ParcelFileDescriptor, path: String){
|
||||||
|
un7zToPath(SevenZFile(ParcelFileDescriptorChannel(pfd)),path)
|
||||||
|
}
|
||||||
|
@SuppressLint("NewApi")
|
||||||
|
fun un7zToPath(fileChannel: FileChannel, path: String){
|
||||||
|
un7zToPath(SevenZFile(fileChannel),path)
|
||||||
|
}
|
||||||
|
fun un7zToPath(file: File, path: String){
|
||||||
|
un7zToPath(SevenZFile(file),path)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun un7zToPath(sevenZFile:SevenZFile, path: String){
|
||||||
|
var entry: SevenZArchiveEntry
|
||||||
|
while (sevenZFile.nextEntry.also { entry=it }!=null){
|
||||||
|
val entryFile = File(path, entry.name)
|
||||||
|
if (entry.isDirectory) {
|
||||||
|
if (!entryFile.exists()) {
|
||||||
|
entryFile.mkdirs()
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (entryFile.parentFile?.exists() != true) {
|
||||||
|
entryFile.parentFile?.mkdirs()
|
||||||
|
}
|
||||||
|
if (!entryFile.exists()) {
|
||||||
|
entryFile.createNewFile()
|
||||||
|
entryFile.setReadable(true)
|
||||||
|
entryFile.setExecutable(true)
|
||||||
|
}
|
||||||
|
FileOutputStream(entryFile).use {
|
||||||
|
sevenZFile.getInputStream(entry).copyTo(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user