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

时间:2012-06-15 10:03:40

标签: java regex zip

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

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

5 个答案:

答案 0 :(得分: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);
        }
     }
  }
}

而不是如果你想使用Andrew Thompson所说的FilenameFilter

您可以在班级中实施FilenameFilter。 这个link给出了更多帮助。 通过这个你不需要检查文件的扩展名。 它只会为您提供那些作为参数传递扩展名的文件。

要提取zip文件(如果找到),您可以获取ZipInputStream包的帮助。 您可以查看here来解压缩文件夹。

答案 1 :(得分:1)

  

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

请参阅File.exists()

答案 2 :(得分: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。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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