pull/357/head
parent
7e8fc8622c
commit
b4990806e0
@ -1,670 +0,0 @@ |
|||||||
package io.legado.app.ui.filechooser.utils |
|
||||||
|
|
||||||
import android.webkit.MimeTypeMap |
|
||||||
import androidx.annotation.IntDef |
|
||||||
import java.io.* |
|
||||||
import java.nio.charset.Charset |
|
||||||
import java.text.SimpleDateFormat |
|
||||||
import java.util.* |
|
||||||
import java.util.regex.Pattern |
|
||||||
|
|
||||||
/** |
|
||||||
* 文件处理 |
|
||||||
* <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> |
|
||||||
* <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> |
|
||||||
* |
|
||||||
* @author 李玉江[QQ:1023694760] |
|
||||||
* @since 2014-4-18 |
|
||||||
*/ |
|
||||||
object FileUtils { |
|
||||||
const val BY_NAME_ASC = 0 |
|
||||||
const val BY_NAME_DESC = 1 |
|
||||||
const val BY_TIME_ASC = 2 |
|
||||||
const val BY_TIME_DESC = 3 |
|
||||||
const val BY_SIZE_ASC = 4 |
|
||||||
const val BY_SIZE_DESC = 5 |
|
||||||
const val BY_EXTENSION_ASC = 6 |
|
||||||
const val BY_EXTENSION_DESC = 7 |
|
||||||
|
|
||||||
@IntDef(value = [BY_NAME_ASC, BY_NAME_DESC, BY_TIME_ASC, BY_TIME_DESC, BY_SIZE_ASC, BY_SIZE_DESC, BY_EXTENSION_ASC, BY_EXTENSION_DESC]) |
|
||||||
@kotlin.annotation.Retention(AnnotationRetention.SOURCE) |
|
||||||
annotation class SortType |
|
||||||
|
|
||||||
/** |
|
||||||
* 将目录分隔符统一为平台默认的分隔符,并为目录结尾添加分隔符 |
|
||||||
*/ |
|
||||||
fun separator(path: String): String { |
|
||||||
var path1 = path |
|
||||||
val separator = File.separator |
|
||||||
path1 = path1.replace("\\", separator) |
|
||||||
if (!path1.endsWith(separator)) { |
|
||||||
path1 += separator |
|
||||||
} |
|
||||||
return path1 |
|
||||||
} |
|
||||||
|
|
||||||
fun closeSilently(c: Closeable?) { |
|
||||||
if (c == null) { |
|
||||||
return |
|
||||||
} |
|
||||||
try { |
|
||||||
c.close() |
|
||||||
} catch (ignored: IOException) { |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 列出指定目录下的所有子目录 |
|
||||||
*/ |
|
||||||
@JvmOverloads |
|
||||||
fun listDirs( |
|
||||||
startDirPath: String, |
|
||||||
excludeDirs: Array<String>? = null, @SortType sortType: Int = BY_NAME_ASC |
|
||||||
): Array<File?> { |
|
||||||
var excludeDirs1 = excludeDirs |
|
||||||
val dirList = ArrayList<File>() |
|
||||||
val startDir = File(startDirPath) |
|
||||||
if (!startDir.isDirectory) { |
|
||||||
return arrayOfNulls(0) |
|
||||||
} |
|
||||||
val dirs = startDir.listFiles(FileFilter { f -> |
|
||||||
if (f == null) { |
|
||||||
return@FileFilter false |
|
||||||
} |
|
||||||
f.isDirectory |
|
||||||
}) |
|
||||||
?: return arrayOfNulls(0) |
|
||||||
if (excludeDirs1 == null) { |
|
||||||
excludeDirs1 = arrayOf() |
|
||||||
} |
|
||||||
for (dir in dirs) { |
|
||||||
val file = dir.absoluteFile |
|
||||||
if (!excludeDirs1.contentDeepToString().contains(file.name)) { |
|
||||||
dirList.add(file) |
|
||||||
} |
|
||||||
} |
|
||||||
when (sortType) { |
|
||||||
BY_NAME_ASC -> Collections.sort(dirList, SortByName()) |
|
||||||
BY_NAME_DESC -> { |
|
||||||
Collections.sort(dirList, SortByName()) |
|
||||||
dirList.reverse() |
|
||||||
} |
|
||||||
BY_TIME_ASC -> Collections.sort(dirList, SortByTime()) |
|
||||||
BY_TIME_DESC -> { |
|
||||||
Collections.sort(dirList, SortByTime()) |
|
||||||
dirList.reverse() |
|
||||||
} |
|
||||||
BY_SIZE_ASC -> Collections.sort(dirList, SortBySize()) |
|
||||||
BY_SIZE_DESC -> { |
|
||||||
Collections.sort(dirList, SortBySize()) |
|
||||||
dirList.reverse() |
|
||||||
} |
|
||||||
BY_EXTENSION_ASC -> Collections.sort(dirList, SortByExtension()) |
|
||||||
BY_EXTENSION_DESC -> { |
|
||||||
Collections.sort(dirList, SortByExtension()) |
|
||||||
dirList.reverse() |
|
||||||
} |
|
||||||
} |
|
||||||
return dirList.toTypedArray() |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 列出指定目录下的所有子目录及所有文件 |
|
||||||
*/ |
|
||||||
@JvmOverloads |
|
||||||
fun listDirsAndFiles( |
|
||||||
startDirPath: String, |
|
||||||
allowExtensions: Array<String>? = null |
|
||||||
): Array<File?>? { |
|
||||||
val dirs: Array<File?>? |
|
||||||
val files: Array<File?>? = if (allowExtensions == null) { |
|
||||||
listFiles(startDirPath) |
|
||||||
} else { |
|
||||||
listFiles(startDirPath, allowExtensions) |
|
||||||
} |
|
||||||
val dirsAndFiles: Array<File?> |
|
||||||
dirs = listDirs(startDirPath) |
|
||||||
if (files == null) { |
|
||||||
return null |
|
||||||
} |
|
||||||
dirsAndFiles = arrayOfNulls(dirs.size + files.size) |
|
||||||
System.arraycopy(dirs, 0, dirsAndFiles, 0, dirs.size) |
|
||||||
System.arraycopy(files, 0, dirsAndFiles, dirs.size, files.size) |
|
||||||
return dirsAndFiles |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 列出指定目录下的所有文件 |
|
||||||
*/ |
|
||||||
@JvmOverloads |
|
||||||
fun listFiles( |
|
||||||
startDirPath: String, |
|
||||||
filterPattern: Pattern? = null, @SortType sortType: Int = BY_NAME_ASC |
|
||||||
): Array<File?> { |
|
||||||
val fileList = ArrayList<File>() |
|
||||||
val f = File(startDirPath) |
|
||||||
if (!f.isDirectory) { |
|
||||||
return arrayOfNulls(0) |
|
||||||
} |
|
||||||
val files = f.listFiles(FileFilter { file -> |
|
||||||
if (file == null) { |
|
||||||
return@FileFilter false |
|
||||||
} |
|
||||||
if (file.isDirectory) { |
|
||||||
return@FileFilter false |
|
||||||
} |
|
||||||
|
|
||||||
filterPattern?.matcher(file.name)?.find() ?: true |
|
||||||
}) |
|
||||||
?: return arrayOfNulls(0) |
|
||||||
for (file in files) { |
|
||||||
fileList.add(file.absoluteFile) |
|
||||||
} |
|
||||||
when (sortType) { |
|
||||||
BY_NAME_ASC -> Collections.sort(fileList, SortByName()) |
|
||||||
BY_NAME_DESC -> { |
|
||||||
Collections.sort(fileList, SortByName()) |
|
||||||
fileList.reverse() |
|
||||||
} |
|
||||||
BY_TIME_ASC -> Collections.sort(fileList, SortByTime()) |
|
||||||
BY_TIME_DESC -> { |
|
||||||
Collections.sort(fileList, SortByTime()) |
|
||||||
fileList.reverse() |
|
||||||
} |
|
||||||
BY_SIZE_ASC -> Collections.sort(fileList, SortBySize()) |
|
||||||
BY_SIZE_DESC -> { |
|
||||||
Collections.sort(fileList, SortBySize()) |
|
||||||
fileList.reverse() |
|
||||||
} |
|
||||||
BY_EXTENSION_ASC -> Collections.sort(fileList, SortByExtension()) |
|
||||||
BY_EXTENSION_DESC -> { |
|
||||||
Collections.sort(fileList, SortByExtension()) |
|
||||||
fileList.reverse() |
|
||||||
} |
|
||||||
} |
|
||||||
return fileList.toTypedArray() |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 列出指定目录下的所有文件 |
|
||||||
*/ |
|
||||||
fun listFiles(startDirPath: String, allowExtensions: Array<String>?): Array<File?>? { |
|
||||||
val file = File(startDirPath) |
|
||||||
return file.listFiles { _, name -> |
|
||||||
//返回当前目录所有以某些扩展名结尾的文件 |
|
||||||
val extension = getExtension(name) |
|
||||||
allowExtensions?.contentDeepToString()?.contains(extension) == true |
|
||||||
|| allowExtensions == null |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 列出指定目录下的所有文件 |
|
||||||
*/ |
|
||||||
fun listFiles(startDirPath: String, allowExtension: String?): Array<File?>? { |
|
||||||
return if (allowExtension == null) |
|
||||||
listFiles(startDirPath, allowExtension = null) |
|
||||||
else |
|
||||||
listFiles(startDirPath, arrayOf(allowExtension)) |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 判断文件或目录是否存在 |
|
||||||
*/ |
|
||||||
fun exist(path: String): Boolean { |
|
||||||
val file = File(path) |
|
||||||
return file.exists() |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 删除文件或目录 |
|
||||||
*/ |
|
||||||
@JvmOverloads |
|
||||||
fun delete(file: File, deleteRootDir: Boolean = false): Boolean { |
|
||||||
var result = false |
|
||||||
if (file.isFile) { |
|
||||||
//是文件 |
|
||||||
result = deleteResolveEBUSY(file) |
|
||||||
} else { |
|
||||||
//是目录 |
|
||||||
val files = file.listFiles() ?: return false |
|
||||||
if (files.isEmpty()) { |
|
||||||
result = deleteRootDir && deleteResolveEBUSY(file) |
|
||||||
} else { |
|
||||||
for (f in files) { |
|
||||||
delete(f, deleteRootDir) |
|
||||||
result = deleteResolveEBUSY(f) |
|
||||||
} |
|
||||||
} |
|
||||||
if (deleteRootDir) { |
|
||||||
result = deleteResolveEBUSY(file) |
|
||||||
} |
|
||||||
} |
|
||||||
return result |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* bug: open failed: EBUSY (Device or resource busy) |
|
||||||
* fix: http://stackoverflow.com/questions/11539657/open-failed-ebusy-device-or-resource-busy |
|
||||||
*/ |
|
||||||
private fun deleteResolveEBUSY(file: File): Boolean { |
|
||||||
// Before you delete a Directory or File: rename it! |
|
||||||
val to = File(file.absolutePath + System.currentTimeMillis()) |
|
||||||
|
|
||||||
file.renameTo(to) |
|
||||||
return to.delete() |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 删除文件或目录 |
|
||||||
*/ |
|
||||||
@JvmOverloads |
|
||||||
fun delete(path: String, deleteRootDir: Boolean = false): Boolean { |
|
||||||
val file = File(path) |
|
||||||
|
|
||||||
return if (file.exists()) { |
|
||||||
delete(file, deleteRootDir) |
|
||||||
} else false |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 复制文件为另一个文件,或复制某目录下的所有文件及目录到另一个目录下 |
|
||||||
*/ |
|
||||||
fun copy(src: String, tar: String): Boolean { |
|
||||||
val srcFile = File(src) |
|
||||||
return srcFile.exists() && copy(srcFile, File(tar)) |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 复制文件或目录 |
|
||||||
*/ |
|
||||||
fun copy(src: File, tar: File): Boolean { |
|
||||||
try { |
|
||||||
if (src.isFile) { |
|
||||||
val `is` = FileInputStream(src) |
|
||||||
val op = FileOutputStream(tar) |
|
||||||
val bis = BufferedInputStream(`is`) |
|
||||||
val bos = BufferedOutputStream(op) |
|
||||||
val bt = ByteArray(1024 * 8) |
|
||||||
while (true) { |
|
||||||
val len = bis.read(bt) |
|
||||||
if (len == -1) { |
|
||||||
break |
|
||||||
} else { |
|
||||||
bos.write(bt, 0, len) |
|
||||||
} |
|
||||||
} |
|
||||||
bis.close() |
|
||||||
bos.close() |
|
||||||
} else if (src.isDirectory) { |
|
||||||
tar.mkdirs() |
|
||||||
src.listFiles()?.forEach { file -> |
|
||||||
copy(file.absoluteFile, File(tar.absoluteFile, file.name)) |
|
||||||
} |
|
||||||
} |
|
||||||
return true |
|
||||||
} catch (e: Exception) { |
|
||||||
return false |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 移动文件或目录 |
|
||||||
*/ |
|
||||||
fun move(src: String, tar: String): Boolean { |
|
||||||
return move(File(src), File(tar)) |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 移动文件或目录 |
|
||||||
*/ |
|
||||||
fun move(src: File, tar: File): Boolean { |
|
||||||
return rename(src, tar) |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 文件重命名 |
|
||||||
*/ |
|
||||||
fun rename(oldPath: String, newPath: String): Boolean { |
|
||||||
return rename(File(oldPath), File(newPath)) |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 文件重命名 |
|
||||||
*/ |
|
||||||
fun rename(src: File, tar: File): Boolean { |
|
||||||
return src.renameTo(tar) |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 读取文本文件, 失败将返回空串 |
|
||||||
*/ |
|
||||||
@JvmOverloads |
|
||||||
fun readText(filepath: String, charset: String = "utf-8"): String { |
|
||||||
try { |
|
||||||
val data = readBytes(filepath) |
|
||||||
if (data != null) { |
|
||||||
return String(data, Charset.forName(charset)).trim { it <= ' ' } |
|
||||||
} |
|
||||||
} catch (ignored: UnsupportedEncodingException) { |
|
||||||
} |
|
||||||
|
|
||||||
return "" |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 读取文件内容, 失败将返回空串 |
|
||||||
*/ |
|
||||||
fun readBytes(filepath: String): ByteArray? { |
|
||||||
var fis: FileInputStream? = null |
|
||||||
try { |
|
||||||
fis = FileInputStream(filepath) |
|
||||||
val baos = ByteArrayOutputStream() |
|
||||||
val buffer = ByteArray(1024) |
|
||||||
while (true) { |
|
||||||
val len = fis.read(buffer, 0, buffer.size) |
|
||||||
if (len == -1) { |
|
||||||
break |
|
||||||
} else { |
|
||||||
baos.write(buffer, 0, len) |
|
||||||
} |
|
||||||
} |
|
||||||
val data = baos.toByteArray() |
|
||||||
baos.close() |
|
||||||
return data |
|
||||||
} catch (e: IOException) { |
|
||||||
return null |
|
||||||
} finally { |
|
||||||
closeSilently(fis) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 保存文本内容 |
|
||||||
*/ |
|
||||||
@JvmOverloads |
|
||||||
fun writeText(filepath: String, content: String, charset: String = "utf-8"): Boolean { |
|
||||||
try { |
|
||||||
writeBytes(filepath, content.toByteArray(charset(charset))) |
|
||||||
return true |
|
||||||
} catch (e: UnsupportedEncodingException) { |
|
||||||
return false |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 保存文件内容 |
|
||||||
*/ |
|
||||||
fun writeBytes(filepath: String, data: ByteArray): Boolean { |
|
||||||
val file = File(filepath) |
|
||||||
var fos: FileOutputStream? = null |
|
||||||
return try { |
|
||||||
if (!file.exists()) { |
|
||||||
file.parentFile?.mkdirs() |
|
||||||
file.createNewFile() |
|
||||||
} |
|
||||||
fos = FileOutputStream(filepath) |
|
||||||
fos.write(data) |
|
||||||
true |
|
||||||
} catch (e: IOException) { |
|
||||||
false |
|
||||||
} finally { |
|
||||||
closeSilently(fos) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 追加文本内容 |
|
||||||
*/ |
|
||||||
fun appendText(path: String, content: String): Boolean { |
|
||||||
val file = File(path) |
|
||||||
var writer: FileWriter? = null |
|
||||||
return try { |
|
||||||
if (!file.exists()) { |
|
||||||
|
|
||||||
file.createNewFile() |
|
||||||
} |
|
||||||
writer = FileWriter(file, true) |
|
||||||
writer.write(content) |
|
||||||
true |
|
||||||
} catch (e: IOException) { |
|
||||||
false |
|
||||||
} finally { |
|
||||||
closeSilently(writer) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取文件大小 |
|
||||||
*/ |
|
||||||
fun getLength(path: String): Long { |
|
||||||
val file = File(path) |
|
||||||
return if (!file.isFile || !file.exists()) { |
|
||||||
0 |
|
||||||
} else file.length() |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取文件或网址的名称(包括后缀) |
|
||||||
*/ |
|
||||||
fun getName(pathOrUrl: String?): String { |
|
||||||
if (pathOrUrl == null) { |
|
||||||
return "" |
|
||||||
} |
|
||||||
val pos = pathOrUrl.lastIndexOf('/') |
|
||||||
return if (0 <= pos) { |
|
||||||
pathOrUrl.substring(pos + 1) |
|
||||||
} else { |
|
||||||
System.currentTimeMillis().toString() + "." + getExtension(pathOrUrl) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取文件名(不包括扩展名) |
|
||||||
*/ |
|
||||||
fun getNameExcludeExtension(path: String): String { |
|
||||||
try { |
|
||||||
var fileName = File(path).name |
|
||||||
val lastIndexOf = fileName.lastIndexOf(".") |
|
||||||
if (lastIndexOf != -1) { |
|
||||||
fileName = fileName.substring(0, lastIndexOf) |
|
||||||
} |
|
||||||
return fileName |
|
||||||
} catch (e: Exception) { |
|
||||||
return "" |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取格式化后的文件大小 |
|
||||||
*/ |
|
||||||
fun getSize(path: String): String { |
|
||||||
val fileSize = getLength(path) |
|
||||||
return ConvertUtils.toFileSizeString(fileSize) |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取文件后缀,不包括“.” |
|
||||||
*/ |
|
||||||
fun getExtension(pathOrUrl: String): String { |
|
||||||
val dotPos = pathOrUrl.lastIndexOf('.') |
|
||||||
return if (0 <= dotPos) { |
|
||||||
pathOrUrl.substring(dotPos + 1) |
|
||||||
} else { |
|
||||||
"ext" |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取文件的MIME类型 |
|
||||||
*/ |
|
||||||
fun getMimeType(pathOrUrl: String): String { |
|
||||||
val ext = getExtension(pathOrUrl) |
|
||||||
val map = MimeTypeMap.getSingleton() |
|
||||||
return map.getMimeTypeFromExtension(ext) ?: "*/*" |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取格式化后的文件/目录创建或最后修改时间 |
|
||||||
*/ |
|
||||||
@JvmOverloads |
|
||||||
fun getDateTime(path: String, format: String = "yyyy年MM月dd日HH:mm"): String { |
|
||||||
val file = File(path) |
|
||||||
return getDateTime(file, format) |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取格式化后的文件/目录创建或最后修改时间 |
|
||||||
*/ |
|
||||||
fun getDateTime(file: File, format: String): String { |
|
||||||
val cal = Calendar.getInstance() |
|
||||||
cal.timeInMillis = file.lastModified() |
|
||||||
return SimpleDateFormat(format, Locale.PRC).format(cal.time) |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 比较两个文件的最后修改时间 |
|
||||||
*/ |
|
||||||
fun compareLastModified(path1: String, path2: String): Int { |
|
||||||
val stamp1 = File(path1).lastModified() |
|
||||||
val stamp2 = File(path2).lastModified() |
|
||||||
return if (stamp1 > stamp2) { |
|
||||||
1 |
|
||||||
} else if (stamp1 < stamp2) { |
|
||||||
-1 |
|
||||||
} else { |
|
||||||
0 |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 创建多级别的目录 |
|
||||||
*/ |
|
||||||
fun makeDirs(path: String): Boolean { |
|
||||||
return makeDirs(File(path)) |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 创建多级别的目录 |
|
||||||
*/ |
|
||||||
fun makeDirs(file: File): Boolean { |
|
||||||
return file.mkdirs() |
|
||||||
} |
|
||||||
|
|
||||||
class SortByExtension : Comparator<File> { |
|
||||||
|
|
||||||
override fun compare(f1: File?, f2: File?): Int { |
|
||||||
return if (f1 == null || f2 == null) { |
|
||||||
if (f1 == null) { |
|
||||||
-1 |
|
||||||
} else { |
|
||||||
1 |
|
||||||
} |
|
||||||
} else { |
|
||||||
if (f1.isDirectory && f2.isFile) { |
|
||||||
-1 |
|
||||||
} else if (f1.isFile && f2.isDirectory) { |
|
||||||
1 |
|
||||||
} else { |
|
||||||
f1.name.compareTo(f2.name, ignoreCase = true) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
class SortByName : Comparator<File> { |
|
||||||
private var caseSensitive: Boolean = false |
|
||||||
|
|
||||||
constructor(caseSensitive: Boolean) { |
|
||||||
this.caseSensitive = caseSensitive |
|
||||||
} |
|
||||||
|
|
||||||
constructor() { |
|
||||||
this.caseSensitive = false |
|
||||||
} |
|
||||||
|
|
||||||
override fun compare(f1: File?, f2: File?): Int { |
|
||||||
if (f1 == null || f2 == null) { |
|
||||||
return if (f1 == null) { |
|
||||||
-1 |
|
||||||
} else { |
|
||||||
1 |
|
||||||
} |
|
||||||
} else { |
|
||||||
return if (f1.isDirectory && f2.isFile) { |
|
||||||
-1 |
|
||||||
} else if (f1.isFile && f2.isDirectory) { |
|
||||||
1 |
|
||||||
} else { |
|
||||||
val s1 = f1.name |
|
||||||
val s2 = f2.name |
|
||||||
if (caseSensitive) { |
|
||||||
s1.compareTo(s2) |
|
||||||
} else { |
|
||||||
s1.compareTo(s2, ignoreCase = true) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
class SortBySize : Comparator<File> { |
|
||||||
|
|
||||||
override fun compare(f1: File?, f2: File?): Int { |
|
||||||
return if (f1 == null || f2 == null) { |
|
||||||
if (f1 == null) { |
|
||||||
-1 |
|
||||||
} else { |
|
||||||
1 |
|
||||||
} |
|
||||||
} else { |
|
||||||
if (f1.isDirectory && f2.isFile) { |
|
||||||
-1 |
|
||||||
} else if (f1.isFile && f2.isDirectory) { |
|
||||||
1 |
|
||||||
} else { |
|
||||||
if (f1.length() < f2.length()) { |
|
||||||
-1 |
|
||||||
} else { |
|
||||||
1 |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
class SortByTime : Comparator<File> { |
|
||||||
|
|
||||||
override fun compare(f1: File?, f2: File?): Int { |
|
||||||
return if (f1 == null || f2 == null) { |
|
||||||
if (f1 == null) { |
|
||||||
-1 |
|
||||||
} else { |
|
||||||
1 |
|
||||||
} |
|
||||||
} else { |
|
||||||
if (f1.isDirectory && f2.isFile) { |
|
||||||
-1 |
|
||||||
} else if (f1.isFile && f2.isDirectory) { |
|
||||||
1 |
|
||||||
} else { |
|
||||||
if (f1.lastModified() > f2.lastModified()) { |
|
||||||
-1 |
|
||||||
} else { |
|
||||||
1 |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
Loading…
Reference in new issue