0

ここで私には理解できないことが起こっています。このコードは、「stuff」ディレクトリ内のすべてのファイルを削除します。

public static void main(String[] args) throws Exception {

    File dire = new File("C:\\Users\\spacitron\\Desktop\\Stuff");

    for (File doc : dire.listFiles()) {
        doc.delete();
    }

}

ただし、重複ファイルのみを削除するなど、何か便利なことをしようとすると機能しません。

public static void main(String[] args) throws Exception {

    File dire = new File("C:\\Users\\spacitron\\Desktop\\Stuff");
    ArrayList<String> hashes = new ArrayList<>();
    for (File doc : dire.listFiles()) {
        String docHash = getHash(doc);
        if (hashes.contains(docHash)) {
            doc.delete();
        } else {
            hashes.add(docHash);
        }
    }

}

public static String getHash(File d) {
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("SHA1");
        FileInputStream inStream = new FileInputStream(d);
        DigestInputStream dis = new DigestInputStream(inStream, md);
        BufferedInputStream bis = new BufferedInputStream(dis);
        while (true) {
            int b = bis.read();
            if (b == -1)
                break;
        }
    } catch (NoSuchAlgorithmException | IOException e) {
        e.printStackTrace();
    }

    BigInteger bi = new BigInteger(md.digest());

    return bi.toString(16);
}

何を与える?

4

2 に答える 2

2

Windows では、開いているファイルを削除することはできません。ただし、Java でのプログラミング時に使用できない特別なフラグで開いている場合を除きます。このコードは Unix システムでは機能しますが、Windows では機能しません。

開いているファイルを閉じることは、一般的には良い考えです。これは、オペレーティング システムによって、アプリケーションが一度に開くことができるファイルの数が制限されるためです。

于 2013-06-24T12:57:03.157 に答える
2

最終ブロックで入力ストリームを閉じる必要があります。これらはファイルにアクセスし、使用中のファイルが削除されないようにします

    FileInputStream inStream = null;
    DigestInputStream dis = null;
    BufferedInputStream bis = null;

    try {
       md = MessageDigest.getInstance("SHA1");
       inStream = new FileInputStream(d);
       dis = new DigestInputStream(inStream, md);
       bis = new BufferedInputStream(dis);
       while (true) {
            int b = bis.read();
            if (b == -1)
                break;
            }
   } catch (NoSuchAlgorithmException | IOException e) {
       e.printStackTrace();
   } finally {
       try{
          if(inStream!= null)
              inStream.close();
          if(dis != null)
              dis.close();
          if(bis != null)
              bis.close()
      } catch (Exception ex){
          ex.printStackTrace()
      }         
    }
于 2013-06-24T12:56:22.263 に答える