确定文件是zip文件还是.xlsx文件

时间:2018-07-19 21:54:26

标签: excel scala zip xlsx unzip

基于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文件之间的区别?

3 个答案:

答案 0 :(得分:0)

由于.zip和.xlsx都具有相同的魔术数,因此我找不到有效的zip文件。

因此,我已经使用Apache Tika查找确切的文档类型。

即使将文件重命名为zip,它也会找到确切的文件类型。

引用Apache tika use cases

答案 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"

并打开它。