Here you can find the source of waitUntilFileDeleted(File file)
Parameter | Description |
---|---|
file | Deleted file |
private static boolean waitUntilFileDeleted(File file)
//package com.java2s; /******************************************************************************* * Copyright (c) 2007, 2012 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * /*ww w.ja v a2 s . c om*/ * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ import java.io.File; public class Main { private static int DELETE_MAX_TIME = 0; /** * Trace deletion operations while running JDT/Core tests. */ private static boolean DELETE_DEBUG = false; /** * Maximum of time in milliseconds to wait in deletion operation while running JDT/Core tests. * Default is 10 seconds. This number cannot exceed 1 minute (i.e. 60000). * <br> * To avoid too many loops while waiting, the ten first ones are done waiting * 10ms before repeating, the ten loops after are done waiting 100ms and * the other loops are done waiting 1s... */ private static int DELETE_MAX_WAIT = 10000; /** * Wait until the file is _really_ deleted on file system. * * @param file Deleted file * @return true if the file was finally deleted, false otherwise */ private static boolean waitUntilFileDeleted(File file) { int count = 0; int delay = 10; // ms int maxRetry = DELETE_MAX_WAIT / delay; int time = 0; while (count < maxRetry) { try { count++; Thread.sleep(delay); time += delay; if (time > DELETE_MAX_TIME) DELETE_MAX_TIME = time; if (DELETE_DEBUG) System.out.print('.'); if (file.exists()) { if (file.delete()) { // SUCCESS return true; } } if (isFileDeleted(file)) { // SUCCESS return true; } // Increment waiting delay exponentially if (count >= 10 && delay <= 100) { count = 1; delay *= 10; maxRetry = DELETE_MAX_WAIT / delay; if ((DELETE_MAX_WAIT % delay) != 0) { maxRetry++; } } } catch (InterruptedException ie) { break; // end loop } } System.err.println(); System.err.println(" !!! ERROR: " + file + " was never deleted even after having waited " //$NON-NLS-1$//$NON-NLS-2$ + DELETE_MAX_TIME + "ms!!!"); //$NON-NLS-1$ System.err.println(); return false; } /** * Delete a file or directory and insure that the file is no longer present * on file system. In case of directory, delete all the hierarchy underneath. * * @param file The file or directory to delete * @return true iff the file was really delete, false otherwise */ public static boolean delete(File file) { if (!file.exists()) { return true; } // flush all directory content if (file.isDirectory()) { flushDirectoryContent(file); } // remove file file.delete(); if (isFileDeleted(file)) { return true; } return waitUntilFileDeleted(file); } /** * Returns whether a file is really deleted or not. * Does not only rely on {@link File#exists()} method but also * look if it's not in its parent children {@link #getParentChildFile(File)}. * * @param file The file to test if deleted * @return true if the file does not exist and was not found in its parent children. */ public static boolean isFileDeleted(File file) { return !file.exists() && getParentChildFile(file) == null; } public static void flushDirectoryContent(File dir) { File[] files = dir.listFiles(); if (files == null) return; for (int i = 0, max = files.length; i < max; i++) { delete(files[i]); } } /** * Returns the parent's child file matching the given file or null if not found. * * @param file The searched file in parent * @return The parent's child matching the given file or null if not found. */ private static File getParentChildFile(File file) { File parent = file.getParentFile(); if (parent == null || !parent.exists()) return null; File[] files = parent.listFiles(); int length = files == null ? 0 : files.length; if (length > 0) { for (int i = 0; i < length; i++) { if (files[i] == file) { return files[i]; } else if (files[i].equals(file)) { return files[i]; } else if (files[i].getPath().equals(file.getPath())) { return files[i]; } } } return null; } }