android 14 创建文件java.io.IOException: Operation not permitted
Operation not permitted
问题原因
一般是创建文件时,文件夹或文件名称包含特殊字符,创建文件或文件夹时需要检查文件名称是否合法
参考android.os.FileUtils代码(内部类,App不可直接使用)
/**
* 文件名称是否合法(FAT系统)
*/
fun isValidFatFilename(name: String?): Boolean {
return name != null && name == buildValidFatFilename(name)
}
private fun trimFilename(res: java.lang.StringBuilder) {
var maxBytes = 255
var raw = res.toString().toByteArray(StandardCharsets.UTF_8)
if (raw.size > maxBytes) {
maxBytes -= 3
while (raw.size > maxBytes) {
res.deleteCharAt(res.length / 2)
raw = res.toString().toByteArray(StandardCharsets.UTF_8)
}
res.insert(res.length / 2, "...")
}
}
/**
* 创建一个合法的文件名称(FAT系统)
*/
fun buildValidFatFilename(name: String): String {
if (TextUtils.isEmpty(name) || "." == name || ".." == name) {
return "(invalid)"
}
val res = java.lang.StringBuilder(name.length)
for (element in name) {
if (isValidFatFilenameChar(element)) {
res.append(element)
} else {
res.append('_')
}
}
trimFilename(res)
return res.toString()
}
// 不合法的字符
private fun isValidFatFilenameChar(c: Char): Boolean {
return if (c.code in 0x00..0x1f) {
false
} else when (c) {
'"', '*', '/', ':', '<', '>', '?', '\\', '|', 0x7F.toChar() -> false
else -> true
}
}