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

4
基于这个答案和另一个我现在找不到的答案,我用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文件的zip文件)。.xlsx文件是一个zip文件,具体来说,在上面的代码中,fileSignature == 0x504B0304将导致一个平面.xslx文件被评估为true。
(注意:旧版/经典Excel文件没有这个问题)
是否有编程的方法来区分.xlsx文件和zip文件?

你是否在查看文件后缀时遇到了问题? - Bob Dalgleish
1
是的,因为有时“.zip”或“.xlsx”不可靠。这也可能被欺骗 - 我不担心恶意欺骗的文件,只是传入文件的来源可能会剥离后缀或意外添加它。 - NateH06
一个Open XML文件具有标准的内部文件结构。您可以检查压缩文件的内容,如果文件结构表明它是Open XML文件,则使用该文件。 - Bob Dalgleish
@Bob 抱歉,我真的不知道 - Open XML和.xlsx文件有关系吗? - NateH06
XLSX文件使用Open XML格式:https://whatis.techtarget.com/fileformat/XLSX-Microsoft-Excel-Open-XML-Document - Bob Dalgleish
@BobDalgeish 谢谢!那就是我必须做的,似乎总共有9-11个文件是一直存在的。我将无论如何解压缩它并检查内容,寻找与预期结果匹配的内容。 - NateH06
3个回答

1

0

由于.zip和.xlsx具有相同的Magic number,我无法找到有效的zip文件。

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

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

参考Apache tika use cases


-1
一个 *.xlsx 文件实际上是一个 *.zip 文件。你可以试试:

"ren MyFile.xlsx MyFile.xlsx.zip"

然后打开它。
真的,试一下吧 i -:)

通过这样做,您可以将一个zip文件转换为一个压缩的zip文件。 - Dominique
@Dominique 不,它只是将扩展名为'.xlsx'的压缩文件更改为扩展名为'.zip'的压缩文件,ren只是重命名文件而不是压缩文件。然而,无论哪种方式,答案都没有相关性,提问者知道'.xlsx'文件是一个压缩文件。问题在于,由于它是一个压缩文件,'.xlsx'的魔数与压缩文件的魔数相同,他们想知道如何区分这两者。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接