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

t8e9dugd  于 2023-01-17  发布在  Scala
关注(0)|答案(3)|浏览(187)

基于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文件?

cfh9epnr

cfh9epnr1#

显然我也在找同样的答案。我有线索了。看https://gitlab.com/hrbrmstr/wand/blob/master/R/check-office.R
在R中,您可以使用它来确定zip和xlsx(以及docx等)之间的差异
这是您需要的函数wand::get_content_type
其他电极导线很少

7uzetpgm

7uzetpgm2#

由于.zip和.xlsx具有相同的幻数,我无法找到有效的zip文件。
因此,我已经使用ApacheTika找到了确切的文档类型。
即使将文件重命名为zip,它也会找到确切的文件类型。
参考Apache tika use cases

iezvtpos

iezvtpos3#

  • .xlsx文件是 *.zip文件。请尝试

“我的文件. xlsxMyFile.xlsx.zip“
打开它。
说真的,试一试吧

相关问题