【发布时间】:2018-07-19 21:54:25
【问题描述】:
基于this 答案和我目前找不到的另一个答案,我在 Scala 中构建了一个函数来确定给定文件路径是否为 zip 文件。显然,如果 zip 文件的标头是存档文件,那么它们的标头会使用一组特定的幻数进行签名。
我需要的基本功能是:1. 接收文件 2. 确定文件是否为 zip 文件,3a. 如果是,解压缩文件并移动生成的文件。 3b。如果不是 zip 文件,只需移动文件即可。所以首先,通过这个函数运行文件来判断它是否是一个zip文件:
import java.io.{File, RandomAccessFile}
import org.apache.commons.io.IOUtils
def isZipFile(filePath: String): Boolean = {
val file = new File(filePath)
var fileSignature = 0
if (file.exists()) {
val raf = new RandomAccessFile(file, "r")
try {
fileSignature = raf.readInt()
} catch {
case e: Exception => println("Whoops")
} finally {
IOUtils.closeQuietly(raf)
}
}
fileSignature == 0x504B0304 || fileSignature == 0x504B0506 || fileSignature == 0x504B0708
}
但是,现在出现了一些错误/边缘情况,评估 fileSignature 的最后一行不再总是准确的。我有时必须通过它传递 .xlsx 文件(以及充满 .xlsx 文件的 zip 文件)。 .xlsx 文件是一个 zip 文件,具体而言,在上面的代码中,fileSignature == 0x504B0304 会导致一个平面 .xslx 文件评估为真。
(注意:旧版/经典 Excel 文件没有此问题)
是否有任何编程方式来区分 .xlsx 文件和 zip 文件?
【问题讨论】:
-
看文件后缀有问题吗?
-
是的,因为有时“.zip”或“.xlsx”并不可靠。这也可以被欺骗 - 我不担心恶意欺骗文件,只是传入文件的来源可能会去除后缀或意外添加它。
-
Open XML 文件具有标准的内部文件结构。您可以检查压缩文件的内容,如果文件结构表明它是 Open XML 文件,您就可以使用它。
-
@Bob 抱歉,我真的不知道 - Open XML 和 .xlsx 文件是否相关?
-
XLSX 文件使用 Open XML 格式:whatis.techtarget.com/fileformat/…
标签: excel scala zip xlsx unzip