【问题标题】:Determine if a file is a zip file or an .xlsx file确定文件是 zip 文件还是 .xlsx 文件
【发布时间】: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


【解决方案1】:

由于 .zip 和 .xlsx 具有相同的幻数,我找不到有效的 zip 文件。

所以,我使用 Apache Tika 来查找确切的文档类型。

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

参考Apache tika use cases

【讨论】:

    【解决方案2】:

    显然我也在寻找相同的答案。 我得到了线索。看https://gitlab.com/hrbrmstr/wand/blob/master/R/check-office.R

    在 R 中,您可以使用它来确定 zip 和 xlsx(以及 docx 等)之间的差异

    这就是你需要的功能wand::get_content_type

    很少有其他线索

    【讨论】:

      【解决方案3】:

      *.xlsx 文件是 *.zip 文件。试试看

      "ren MyFile.xlsx MyFile.xlsx.zip"

      然后打开它。

      【讨论】:

      • 通过这样做,您可以将 zipfile 转换为 zip 压缩文件。
      猜你喜欢
      • 2016-02-25
      • 2012-05-31
      • 1970-01-01
      • 2012-08-04
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      相关资源
      最近更新 更多