DiskChecker.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:3k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.util;
  19. import java.io.File;
  20. import java.io.IOException;
  21. /**
  22.  * Class that provides utility functions for checking disk problem
  23.  */
  24. public class DiskChecker {
  25.   public static class DiskErrorException extends IOException {
  26.     public DiskErrorException(String msg) {
  27.       super(msg);
  28.     }
  29.   }
  30.     
  31.   public static class DiskOutOfSpaceException extends IOException {
  32.     public DiskOutOfSpaceException(String msg) {
  33.       super(msg);
  34.     }
  35.   }
  36.       
  37.   /** 
  38.    * The semantics of mkdirsWithExistsCheck method is different from the mkdirs
  39.    * method provided in the Sun's java.io.File class in the following way:
  40.    * While creating the non-existent parent directories, this method checks for
  41.    * the existence of those directories if the mkdir fails at any point (since
  42.    * that directory might have just been created by some other process).
  43.    * If both mkdir() and the exists() check fails for any seemingly 
  44.    * non-existent directory, then we signal an error; Sun's mkdir would signal
  45.    * an error (return false) if a directory it is attempting to create already
  46.    * exists or the mkdir fails.
  47.    * @param dir
  48.    * @return true on success, false on failure
  49.    */
  50.   public static boolean mkdirsWithExistsCheck(File dir) {
  51.     if (dir.mkdir() || dir.exists()) {
  52.       return true;
  53.     }
  54.     File canonDir = null;
  55.     try {
  56.       canonDir = dir.getCanonicalFile();
  57.     } catch (IOException e) {
  58.       return false;
  59.     }
  60.     String parent = canonDir.getParent();
  61.     return (parent != null) && 
  62.            (mkdirsWithExistsCheck(new File(parent)) &&
  63.                                       (canonDir.mkdir() || canonDir.exists()));
  64.   }
  65.   
  66.   public static void checkDir(File dir) throws DiskErrorException {
  67.     if (!mkdirsWithExistsCheck(dir))
  68.       throw new DiskErrorException("can not create directory: " 
  69.                                    + dir.toString());
  70.         
  71.     if (!dir.isDirectory())
  72.       throw new DiskErrorException("not a directory: " 
  73.                                    + dir.toString());
  74.             
  75.     if (!dir.canRead())
  76.       throw new DiskErrorException("directory is not readable: " 
  77.                                    + dir.toString());
  78.             
  79.     if (!dir.canWrite())
  80.       throw new DiskErrorException("directory is not writable: " 
  81.                                    + dir.toString());
  82.   }
  83. }