基于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
}
然而现在有一点bug/边缘情况,最后一行求值fileSignature
不再总是准确的。我有时不得不通过它传递.xlsx文件(以及充满.xlsx文件的zip文件)。一个.xlsx文件是一个zip文件,具体地说,在上面的代码中,fileSignature == 0x504B0304
导致一个平面.xslx文件求值为true。
(note:旧版/经典Excel文件没有此问题)
有没有什么编程方法可以区分.xlsx文件和zip文件?
3条答案
按热度按时间cfh9epnr1#
显然我也在找同样的答案。我有线索了。看https://gitlab.com/hrbrmstr/wand/blob/master/R/check-office.R
在R中,您可以使用它来确定zip和xlsx(以及docx等)之间的差异
这是您需要的函数
wand::get_content_type
其他电极导线很少
7uzetpgm2#
由于.zip和.xlsx具有相同的幻数,我无法找到有效的zip文件。
因此,我已经使用ApacheTika找到了确切的文档类型。
即使将文件重命名为zip,它也会找到确切的文件类型。
参考Apache tika use cases
iezvtpos3#
“我的文件. xlsxMyFile.xlsx.zip“
打开它。
说真的,试一试吧