【问题标题】:Check if any Zip file is present on a given path检查给定路径上是否存在任何 Zip 文件
【发布时间】:2012-06-18 09:36:01
【问题描述】:

我想检查指定路径上是否存在任何 Zip 文件。如果存在,那么我想在同一路径上提取该文件。

如何检查给定路径上是否存在任何 Zip 文件?

【问题讨论】:

  • 尝试打开Try-Catch块中的zip文件,打开成功则存在,否则进入catch块:)
  • 看看这个问题,你可以把它应用到你的问题上:stackoverflow.com/questions/794381
  • BTW - DYM 1 特定存档,或给定路径下所有目录中的所有存档,还是其他?

标签: java regex zip


【解决方案1】:

这会解压缩一个目录中的所有文件,但很容易修改为仅解压缩特定文件。

package com.wedgeless.stackoverflow;

import java.io.*;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

/**
 * Unzips all zip files in a directory
 * @author mk
 */
public final class Unzipper
{
  public static final String DOT_ZIP = ".ZIP";
  public static final FilenameFilter DOT_ZIP_FILTER = new FilenameFilter()
  {
    @Override
    public boolean accept(File dir, String name)
    {
      return name.toUpperCase().endsWith(DOT_ZIP);
    }
  };

  public static void main(String[] args)
  {
    File dir = new File("/path/to/dir");
    Unzipper unzipper = new Unzipper();
    unzipper.unzipDir(dir);
  }

  public void unzipDir(File dir)
  {
    for (File file : dir.listFiles(DOT_ZIP_FILTER))
    {
      unzip(file);
    }
  }

  protected void unzip(File file)
  {
    File dir = getZipDir(file);
    try
    {
      dir.mkdirs();
      ZipFile zip = new ZipFile(file);
      Enumeration<? extends ZipEntry> zipEntries = zip.entries();
      while (zipEntries.hasMoreElements())
      {
        ZipEntry zipEntry = zipEntries.nextElement();
        File outputFile = new File(dir, zipEntry.getName());
        outputFile.getParentFile().mkdirs();
        if (!zipEntry.isDirectory())
        {
          write(zip, zipEntry, outputFile);
        }
      }
    }
    catch (IOException e)
    {
      dir.delete();
    }
  }

  protected void write(ZipFile zip, ZipEntry zipEntry, File outputFile)
    throws IOException
  {
    final BufferedInputStream input = new BufferedInputStream(zip.getInputStream(zipEntry));
    final int buffsize = 1024;
    final byte buffer[] = new byte[buffsize];
    final BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(outputFile), buffsize);
    try
    {
      while (input.available() > 0)
      {
        input.read(buffer, 0, buffsize);
        output.write(buffer, 0, buffsize);
      }
    }
    finally
    {
      output.flush();
      output.close();
      input.close();
    }
  }

  protected File getZipDir(File zip)
  {
    File dir = zip.getParentFile();

    int index = zip.getName().toUpperCase().lastIndexOf(DOT_ZIP);
    String zipPath = zip.getName().substring(0, index);
    File zipDir = new File(dir, zipPath);
    return zipDir;
  }
}

在极少数情况下,您会在非标准情况下获得带有扩展名的 zip 文件,例如file.ZIP

编辑:我想我应该更仔细地阅读这个问题。您只问如何识别路径上是否存在 zip 文件,而不是如何提取它。只需使用 FilenameFilter 方法...如果有任何命中返回 true,否则返回 false。

【讨论】:

    【解决方案2】:

    您可以尝试使用此代码检查目录中文件的扩展名,如果存在 Zip 文件,则打印文件名。

     public static void main(String[] args) 
    {
    
      // Directory path here
      String path = "."; 
    
      String files;
      File folder = new File(path);
      File[] listOfFiles = folder.listFiles(); 
    
      for (int i = 0; i < listOfFiles.length; i++) 
      {
    
       if (listOfFiles[i].isFile()) 
       {
       files = listOfFiles[i].getName();
           if (files.endsWith(".rar") || files.endsWith(".zip"))
           {
              System.out.println(files);
            }
         }
      }
    }
    

    如果你想使用FilenameFilter,就像 Andrew Thompson 所说的那样。

    你可以在你的类中实现 FilenameFilter。 对此link 提供了更多帮助。 这样你就不需要检查文件的扩展名了。 它只会给你那些扩展名作为参数传递的文件。

    若要提取 zip 文件(如果找到),您可以借助 ZipInputStream 包。 你可以看看here解压文件夹。

    【讨论】:

    • folder.listFiles() 这就是FilenameFilter 派上用场的地方。
    • @vikiiii 我认为 Andrew 的观点是,与其返回目录中文件的完整列表然后遍历它们,不如传递一个检查 .zip 扩展名的 FilenameFilter,从而只返回您关心的文件。
    【解决方案3】:

    测试您想要使用的任何资源可用性的最佳方法就是尝试使用它。任何其他技术都容易受到计时窗口问题的影响,批评你试图预测未来,双重编码等等等等。只要抓住当你试图打开它时发生的FileNotFoundException。反正你要抓住它,为什么要写两次相同的代码?

    【讨论】:

      【解决方案4】:

      获取一个 File 变量并遍历 director 中的所有文件,然后检查 .zip 或 .tar.gz 或 .rar How to iterate over the files of a certain directory, in Java?

      【讨论】:

        【解决方案5】:

        如何检查给定路径上是否存在任何 Zip 文件?

        见File.exists()

        【讨论】:

        • @Andrew Thompson:vikiii 是正确的我想检查 zip 文件是否存在。
        猜你喜欢
        • 2021-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多