HADOOP-6531. Enhance FileUtil with an API to delete all contents of a directory. Contributed by Amareshwari Sriramadasu.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@906177 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
940389afce
commit
9f7a07f908
|
@ -125,6 +125,9 @@ Trunk (unreleased changes)
|
||||||
HADOOP-6518. Makes the UGI honor the env var KRB5CCNAME.
|
HADOOP-6518. Makes the UGI honor the env var KRB5CCNAME.
|
||||||
(Owen O'Malley via ddas)
|
(Owen O'Malley via ddas)
|
||||||
|
|
||||||
|
HADOOP-6531. Enhance FileUtil with an API to delete all contents of a
|
||||||
|
directory. (Amareshwari Sriramadasu via yhemanth)
|
||||||
|
|
||||||
OPTIMIZATIONS
|
OPTIMIZATIONS
|
||||||
|
|
||||||
BUG FIXES
|
BUG FIXES
|
||||||
|
|
|
@ -71,6 +71,17 @@ public class FileUtil {
|
||||||
* we return false, the directory may be partially-deleted.
|
* we return false, the directory may be partially-deleted.
|
||||||
*/
|
*/
|
||||||
public static boolean fullyDelete(File dir) throws IOException {
|
public static boolean fullyDelete(File dir) throws IOException {
|
||||||
|
if (!fullyDeleteContents(dir)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return dir.delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete the contents of a directory, not the directory itself. If
|
||||||
|
* we return false, the directory may be partially-deleted.
|
||||||
|
*/
|
||||||
|
public static boolean fullyDeleteContents(File dir) throws IOException {
|
||||||
File contents[] = dir.listFiles();
|
File contents[] = dir.listFiles();
|
||||||
if (contents != null) {
|
if (contents != null) {
|
||||||
for (int i = 0; i < contents.length; i++) {
|
for (int i = 0; i < contents.length; i++) {
|
||||||
|
@ -95,7 +106,7 @@ public class FileUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return dir.delete();
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,154 @@
|
||||||
|
/**
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.hadoop.fs;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class TestFileUtil {
|
||||||
|
final static private File TEST_DIR = new File(System.getProperty(
|
||||||
|
"test.build.data", "/tmp"), "fu");
|
||||||
|
private static String FILE = "x";
|
||||||
|
private static String LINK = "y";
|
||||||
|
private static String DIR = "dir";
|
||||||
|
private File del = new File(TEST_DIR, "del");
|
||||||
|
private File tmp = new File(TEST_DIR, "tmp");
|
||||||
|
private File dir1 = new File(del, DIR + "1");
|
||||||
|
private File dir2 = new File(del, DIR + "2");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates directories del and tmp for testing.
|
||||||
|
*
|
||||||
|
* Contents of them are
|
||||||
|
* dir:tmp:
|
||||||
|
* file: x
|
||||||
|
* dir:del:
|
||||||
|
* file: x
|
||||||
|
* dir: dir1 : file:x
|
||||||
|
* dir: dir2 : file:x
|
||||||
|
* link: y to tmp/x
|
||||||
|
* link: tmpDir to tmp
|
||||||
|
*/
|
||||||
|
private void setupDirs() throws IOException {
|
||||||
|
Assert.assertFalse(del.exists());
|
||||||
|
Assert.assertFalse(tmp.exists());
|
||||||
|
del.mkdirs();
|
||||||
|
tmp.mkdirs();
|
||||||
|
new File(del, FILE).createNewFile();
|
||||||
|
File tmpFile = new File(tmp, FILE);
|
||||||
|
tmpFile.createNewFile();
|
||||||
|
|
||||||
|
// create directories
|
||||||
|
dir1.mkdirs();
|
||||||
|
dir2.mkdirs();
|
||||||
|
new File(dir1, FILE).createNewFile();
|
||||||
|
new File(dir2, FILE).createNewFile();
|
||||||
|
|
||||||
|
// create a symlink to file
|
||||||
|
File link = new File(del, LINK);
|
||||||
|
FileUtil.symLink(tmpFile.toString(), link.toString());
|
||||||
|
|
||||||
|
// create a symlink to dir
|
||||||
|
File linkDir = new File(del, "tmpDir");
|
||||||
|
FileUtil.symLink(tmp.toString(), linkDir.toString());
|
||||||
|
Assert.assertEquals(5, del.listFiles().length);
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() throws IOException {
|
||||||
|
FileUtil.fullyDelete(del);
|
||||||
|
FileUtil.fullyDelete(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFullyDelete() throws IOException {
|
||||||
|
setupDirs();
|
||||||
|
boolean ret = FileUtil.fullyDelete(del);
|
||||||
|
Assert.assertTrue(ret);
|
||||||
|
Assert.assertFalse(del.exists());
|
||||||
|
validateTmpDir();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFullyDeleteContents() throws IOException {
|
||||||
|
setupDirs();
|
||||||
|
boolean ret = FileUtil.fullyDeleteContents(del);
|
||||||
|
Assert.assertTrue(ret);
|
||||||
|
Assert.assertTrue(del.exists());
|
||||||
|
Assert.assertEquals(0, del.listFiles().length);
|
||||||
|
validateTmpDir();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateTmpDir() {
|
||||||
|
Assert.assertTrue(tmp.exists());
|
||||||
|
Assert.assertEquals(1, tmp.listFiles().length);
|
||||||
|
Assert.assertTrue(new File(tmp, FILE).exists());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a directory which can not be deleted.
|
||||||
|
*
|
||||||
|
* Contents of the directory are :
|
||||||
|
* dir : del
|
||||||
|
* dir : dir1 : x. this directory is not writable
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
private void setupDirsAndNonWritablePermissions() throws IOException {
|
||||||
|
Assert.assertFalse(del.exists());
|
||||||
|
del.mkdirs();
|
||||||
|
new File(del, FILE).createNewFile();
|
||||||
|
|
||||||
|
// create directory
|
||||||
|
dir1.mkdirs();
|
||||||
|
new File(dir1, FILE).createNewFile();
|
||||||
|
changePermissions(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// sets writable permissions for dir1
|
||||||
|
private void changePermissions(boolean perm) {
|
||||||
|
dir1.setWritable(perm);
|
||||||
|
}
|
||||||
|
|
||||||
|
// validates the return value
|
||||||
|
// validates the directory:dir1 exists
|
||||||
|
// sets writable permissions for the directory so that it can be deleted in
|
||||||
|
// tearDown()
|
||||||
|
private void validateAndSetWritablePermissions(boolean ret) {
|
||||||
|
Assert.assertFalse(ret);
|
||||||
|
Assert.assertTrue(dir1.exists());
|
||||||
|
changePermissions(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFailFullyDelete() throws IOException {
|
||||||
|
setupDirsAndNonWritablePermissions();
|
||||||
|
boolean ret = FileUtil.fullyDelete(del);
|
||||||
|
validateAndSetWritablePermissions(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFailFullyDeleteContents() throws IOException {
|
||||||
|
setupDirsAndNonWritablePermissions();
|
||||||
|
boolean ret = FileUtil.fullyDeleteContents(del);
|
||||||
|
validateAndSetWritablePermissions(ret);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue