基于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文件的格式为true。
(注意:较早/经典的Excel文件没有此问题)
是否可以通过编程方式分辨.xlsx文件和zip文件之间的区别?
答案 0 :(得分:0)
由于.zip和.xlsx都具有相同的魔术数,因此我找不到有效的zip文件。
因此,我已经使用Apache Tika查找确切的文档类型。
即使将文件重命名为zip,它也会找到确切的文件类型。
答案 1 :(得分:0)
显然我也在寻找相同的答案。 我取得了领先。看https://gitlab.com/hrbrmstr/wand/blob/master/R/check-office.R
在R中,您可以使用它来确定zip和xlsx(以及docx等)之间的差异
这是您需要的功能wand::get_content_type
其他线索
答案 2 :(得分:-1)
*.xlsx 文件是 *.zip 文件。试试吧
"ren MyFile.xlsx MyFile.xlsx.zip"
并打开它。