FileSystemUtils.java revision 96c5af40d639d629267794f4f0338a267ff94ce5
196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/* 296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * this work for additional information regarding copyright ownership. 596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * (the "License"); you may not use this file except in compliance with 796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * the License. You may obtain a copy of the License at 896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 1096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 1196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * See the License for the specific language governing permissions and 1596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * limitations under the License. 1696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 1796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpackage org.apache.commons.io; 1896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 1996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.BufferedReader; 2096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.IOException; 2196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.InputStream; 2296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.InputStreamReader; 2396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.OutputStream; 2496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.util.ArrayList; 2596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.util.Arrays; 2696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.util.List; 2796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.util.StringTokenizer; 2896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 2996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/** 3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * General File System utilities. 3196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p> 3296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * This class provides static utility methods for general file system 3396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * functions not provided via the JDK {@link java.io.File File} class. 3496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p> 3596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * The current functions provided are: 3696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <ul> 3796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <li>Get the free space on a drive 3896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * </ul> 3996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 4096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @author Frank W. Zammetti 4196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @author Stephen Colebourne 4296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @author Thomas Ledoux 4396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @author James Urie 4496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @author Magnus Grimsell 4596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @author Thomas Ledoux 4696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @version $Id: FileSystemUtils.java 453889 2006-10-07 11:56:25Z scolebourne $ 4796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @since Commons IO 1.1 4896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 4996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpublic class FileSystemUtils { 5096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 5196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** Singleton instance, used mainly for testing. */ 5296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project private static final FileSystemUtils INSTANCE = new FileSystemUtils(); 5396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 5496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** Operating system state flag for error. */ 5596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project private static final int INIT_PROBLEM = -1; 5696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** Operating system state flag for neither Unix nor Windows. */ 5796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project private static final int OTHER = 0; 5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** Operating system state flag for Windows. */ 5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project private static final int WINDOWS = 1; 6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** Operating system state flag for Unix. */ 6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project private static final int UNIX = 2; 6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** Operating system state flag for Posix flavour Unix. */ 6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project private static final int POSIX_UNIX = 3; 6496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 6596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** The operating system flag. */ 6696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project private static final int OS; 6796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project static { 6896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project int os = OTHER; 6996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project try { 7096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project String osName = System.getProperty("os.name"); 7196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (osName == null) { 7296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throw new IOException("os.name not found"); 7396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 7496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project osName = osName.toLowerCase(); 7596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // match 7696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (osName.indexOf("windows") != -1) { 7796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project os = WINDOWS; 7896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } else if (osName.indexOf("linux") != -1 || 7996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project osName.indexOf("sun os") != -1 || 8096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project osName.indexOf("sunos") != -1 || 8196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project osName.indexOf("solaris") != -1 || 8296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project osName.indexOf("mpe/ix") != -1 || 8396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project osName.indexOf("freebsd") != -1 || 8496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project osName.indexOf("irix") != -1 || 8596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project osName.indexOf("digital unix") != -1 || 8696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project osName.indexOf("unix") != -1 || 8796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project osName.indexOf("mac os x") != -1) { 8896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project os = UNIX; 8996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } else if (osName.indexOf("hp-ux") != -1 || 9096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project osName.indexOf("aix") != -1) { 9196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project os = POSIX_UNIX; 9296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } else { 9396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project os = OTHER; 9496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 9596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 9696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } catch (Exception ex) { 9796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project os = INIT_PROBLEM; 9896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 9996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project OS = os; 10096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 10196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 10296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 10396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Instances should NOT be constructed in standard programming. 10496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 10596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public FileSystemUtils() { 10696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project super(); 10796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 10896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 10996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project //----------------------------------------------------------------------- 11096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 11196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Returns the free space on a drive or volume by invoking 11296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * the command line. 11396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * This method does not normalize the result, and typically returns 11496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * bytes on Windows, 512 byte units on OS X and kilobytes on Unix. 11596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * As this is not very useful, this method is deprecated in favour 11696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * of {@link #freeSpaceKb(String)} which returns a result in kilobytes. 11796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p> 11896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Note that some OS's are NOT currently supported, including OS/390, 11996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * OpenVMS and and SunOS 5. (SunOS is supported by <code>freeSpaceKb</code>.) 12096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <pre> 12196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * FileSystemUtils.freeSpace("C:"); // Windows 12296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * FileSystemUtils.freeSpace("/volume"); // *nix 12396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * </pre> 12496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * The free space is calculated via the command line. 12596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * It uses 'dir /-c' on Windows and 'df' on *nix. 12696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 12796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param path the path to get free space for, not null, not empty on Unix 12896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @return the amount of free drive space on the drive or volume 12996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IllegalArgumentException if the path is invalid 13096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IllegalStateException if an error occurred in initialisation 13196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IOException if an error occurs when finding the free space 13296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @since Commons IO 1.1, enhanced OS support in 1.2 and 1.3 13396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @deprecated Use freeSpaceKb(String) 13496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Deprecated from 1.3, may be removed in 2.0 13596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 13696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public static long freeSpace(String path) throws IOException { 13796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return INSTANCE.freeSpaceOS(path, OS, false); 13896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 13996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 14096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project //----------------------------------------------------------------------- 14196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 14296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Returns the free space on a drive or volume in kilobytes by invoking 14396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * the command line. 14496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <pre> 14596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * FileSystemUtils.freeSpaceKb("C:"); // Windows 14696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * FileSystemUtils.freeSpaceKb("/volume"); // *nix 14796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * </pre> 14896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * The free space is calculated via the command line. 14996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * It uses 'dir /-c' on Windows, 'df -kP' on AIX/HP-UX and 'df -k' on other Unix. 15096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p> 15196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * In order to work, you must be running Windows, or have a implementation of 15296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unix df that supports GNU format when passed -k (or -kP). If you are going 15396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * to rely on this code, please check that it works on your OS by running 15496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * some simple tests to compare the command line with the output from this class. 15596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * If your operating system isn't supported, please raise a JIRA call detailing 15696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * the exact result from df -k and as much other detail as possible, thanks. 15796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 15896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param path the path to get free space for, not null, not empty on Unix 15996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @return the amount of free drive space on the drive or volume in kilobytes 16096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IllegalArgumentException if the path is invalid 16196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IllegalStateException if an error occurred in initialisation 16296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IOException if an error occurs when finding the free space 16396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @since Commons IO 1.2, enhanced OS support in 1.3 16496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 16596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public static long freeSpaceKb(String path) throws IOException { 16696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return INSTANCE.freeSpaceOS(path, OS, true); 16796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 16896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 16996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project //----------------------------------------------------------------------- 17096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 17196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Returns the free space on a drive or volume in a cross-platform manner. 17296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Note that some OS's are NOT currently supported, including OS/390. 17396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <pre> 17496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * FileSystemUtils.freeSpace("C:"); // Windows 17596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * FileSystemUtils.freeSpace("/volume"); // *nix 17696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * </pre> 17796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * The free space is calculated via the command line. 17896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * It uses 'dir /-c' on Windows and 'df' on *nix. 17996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 18096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param path the path to get free space for, not null, not empty on Unix 18196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param os the operating system code 18296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param kb whether to normalize to kilobytes 18396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @return the amount of free drive space on the drive or volume 18496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IllegalArgumentException if the path is invalid 18596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IllegalStateException if an error occurred in initialisation 18696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IOException if an error occurs when finding the free space 18796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 18896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project long freeSpaceOS(String path, int os, boolean kb) throws IOException { 18996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (path == null) { 19096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throw new IllegalArgumentException("Path must not be empty"); 19196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 19296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project switch (os) { 19396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project case WINDOWS: 19496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return (kb ? freeSpaceWindows(path) / 1024 : freeSpaceWindows(path)); 19596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project case UNIX: 19696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return freeSpaceUnix(path, kb, false); 19796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project case POSIX_UNIX: 19896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return freeSpaceUnix(path, kb, true); 19996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project case OTHER: 20096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throw new IllegalStateException("Unsupported operating system"); 20196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project default: 20296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throw new IllegalStateException( 20396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "Exception caught when determining operating system"); 20496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 20596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 20696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 20796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project //----------------------------------------------------------------------- 20896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 20996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Find free space on the Windows platform using the 'dir' command. 21096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 21196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param path the path to get free space for, including the colon 21296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @return the amount of free drive space on the drive 21396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IOException if an error occurs 21496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 21596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project long freeSpaceWindows(String path) throws IOException { 21696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project path = FilenameUtils.normalize(path); 21796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (path.length() > 2 && path.charAt(1) == ':') { 21896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project path = path.substring(0, 2); // seems to make it work 21996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 22096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 22196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // build and run the 'dir' command 22296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project String[] cmdAttribs = new String[] {"cmd.exe", "/C", "dir /-c " + path}; 22396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 22496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // read in the output of the command to an ArrayList 22596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project List lines = performCommand(cmdAttribs, Integer.MAX_VALUE); 22696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 22796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // now iterate over the lines we just read and find the LAST 22896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // non-empty line (the free space bytes should be in the last element 22996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // of the ArrayList anyway, but this will ensure it works even if it's 23096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // not, still assuming it is on the last non-blank line) 23196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project for (int i = lines.size() - 1; i >= 0; i--) { 23296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project String line = (String) lines.get(i); 23396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (line.length() > 0) { 23496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return parseDir(line, path); 23596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 23696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 23796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // all lines are blank 23896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throw new IOException( 23996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "Command line 'dir /-c' did not return any info " + 24096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "for path '" + path + "'"); 24196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 24296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 24396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 24496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Parses the Windows dir response last line 24596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 24696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param line the line to parse 24796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param path the path that was sent 24896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @return the number of bytes 24996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IOException if an error occurs 25096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 25196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project long parseDir(String line, String path) throws IOException { 25296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // read from the end of the line to find the last numeric 25396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // character on the line, then continue until we find the first 25496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // non-numeric character, and everything between that and the last 25596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // numeric character inclusive is our free space bytes count 25696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project int bytesStart = 0; 25796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project int bytesEnd = 0; 25896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project int j = line.length() - 1; 25996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project innerLoop1: while (j >= 0) { 26096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project char c = line.charAt(j); 26196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (Character.isDigit(c)) { 26296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // found the last numeric character, this is the end of 26396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // the free space bytes count 26496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project bytesEnd = j + 1; 26596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project break innerLoop1; 26696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 26796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project j--; 26896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 26996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project innerLoop2: while (j >= 0) { 27096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project char c = line.charAt(j); 27196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (!Character.isDigit(c) && c != ',' && c != '.') { 27296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // found the next non-numeric character, this is the 27396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // beginning of the free space bytes count 27496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project bytesStart = j + 1; 27596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project break innerLoop2; 27696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 27796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project j--; 27896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 27996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (j < 0) { 28096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throw new IOException( 28196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "Command line 'dir /-c' did not return valid info " + 28296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "for path '" + path + "'"); 28396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 28496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 28596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // remove commas and dots in the bytes count 28696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project StringBuffer buf = new StringBuffer(line.substring(bytesStart, bytesEnd)); 28796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project for (int k = 0; k < buf.length(); k++) { 28896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (buf.charAt(k) == ',' || buf.charAt(k) == '.') { 28996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project buf.deleteCharAt(k--); 29096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 29196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 29296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return parseBytes(buf.toString(), path); 29396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 29496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 29596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project //----------------------------------------------------------------------- 29696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 29796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Find free space on the *nix platform using the 'df' command. 29896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 29996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param path the path to get free space for 30096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param kb whether to normalize to kilobytes 30196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param posix whether to use the posix standard format flag 30296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @return the amount of free drive space on the volume 30396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IOException if an error occurs 30496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 30596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project long freeSpaceUnix(String path, boolean kb, boolean posix) throws IOException { 30696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (path.length() == 0) { 30796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throw new IllegalArgumentException("Path must not be empty"); 30896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 30996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project path = FilenameUtils.normalize(path); 31096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 31196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // build and run the 'dir' command 31296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project String flags = "-"; 31396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (kb) { 31496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project flags += "k"; 31596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 31696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (posix) { 31796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project flags += "P"; 31896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 31996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project String[] cmdAttribs = 32096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project (flags.length() > 1 ? new String[] {"df", flags, path} : new String[] {"df", path}); 32196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 32296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // perform the command, asking for up to 3 lines (header, interesting, overflow) 32396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project List lines = performCommand(cmdAttribs, 3); 32496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (lines.size() < 2) { 32596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // unknown problem, throw exception 32696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throw new IOException( 32796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "Command line 'df' did not return info as expected " + 32896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "for path '" + path + "'- response was " + lines); 32996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 33096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project String line2 = (String) lines.get(1); // the line we're interested in 33196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 33296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // Now, we tokenize the string. The fourth element is what we want. 33396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project StringTokenizer tok = new StringTokenizer(line2, " "); 33496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (tok.countTokens() < 4) { 33596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // could be long Filesystem, thus data on third line 33696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (tok.countTokens() == 1 && lines.size() >= 3) { 33796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project String line3 = (String) lines.get(2); // the line may be interested in 33896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project tok = new StringTokenizer(line3, " "); 33996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } else { 34096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throw new IOException( 34196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "Command line 'df' did not return data as expected " + 34296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "for path '" + path + "'- check path is valid"); 34396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 34496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } else { 34596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project tok.nextToken(); // Ignore Filesystem 34696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 34796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project tok.nextToken(); // Ignore 1K-blocks 34896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project tok.nextToken(); // Ignore Used 34996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project String freeSpace = tok.nextToken(); 35096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return parseBytes(freeSpace, path); 35196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 35296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 35396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project //----------------------------------------------------------------------- 35496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 35596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Parses the bytes from a string. 35696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 35796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param freeSpace the free space string 35896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param path the path 35996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @return the number of bytes 36096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IOException if an error occurs 36196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 36296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project long parseBytes(String freeSpace, String path) throws IOException { 36396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project try { 36496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project long bytes = Long.parseLong(freeSpace); 36596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (bytes < 0) { 36696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throw new IOException( 36796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "Command line 'df' did not find free space in response " + 36896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "for path '" + path + "'- check path is valid"); 36996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 37096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return bytes; 37196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 37296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } catch (NumberFormatException ex) { 37396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throw new IOException( 37496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "Command line 'df' did not return numeric data as expected " + 37596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "for path '" + path + "'- check path is valid"); 37696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 37796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 37896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 37996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project //----------------------------------------------------------------------- 38096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 38196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Performs the os command. 38296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 38396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param cmdAttribs the command line parameters 38496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param max The maximum limit for the lines returned 38596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @return the parsed data 38696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IOException if an error occurs 38796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 38896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project List performCommand(String[] cmdAttribs, int max) throws IOException { 38996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // this method does what it can to avoid the 'Too many open files' error 39096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // based on trial and error and these links: 39196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4784692 39296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4801027 39396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // http://forum.java.sun.com/thread.jspa?threadID=533029&messageID=2572018 39496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // however, its still not perfect as the JDK support is so poor 39596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // (see commond-exec or ant for a better multi-threaded multi-os solution) 39696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 39796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project List lines = new ArrayList(20); 39896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project Process proc = null; 39996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project InputStream in = null; 40096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project OutputStream out = null; 40196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project InputStream err = null; 40296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project BufferedReader inr = null; 40396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project try { 40496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project proc = openProcess(cmdAttribs); 40596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project in = proc.getInputStream(); 40696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project out = proc.getOutputStream(); 40796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project err = proc.getErrorStream(); 40896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project inr = new BufferedReader(new InputStreamReader(in)); 40996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project String line = inr.readLine(); 41096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project while (line != null && lines.size() < max) { 41196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project line = line.toLowerCase().trim(); 41296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project lines.add(line); 41396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project line = inr.readLine(); 41496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 41596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 41696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project proc.waitFor(); 41796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (proc.exitValue() != 0) { 41896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // os command problem, throw exception 41996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throw new IOException( 42096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "Command line returned OS error code '" + proc.exitValue() + 42196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "' for command " + Arrays.asList(cmdAttribs)); 42296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 42396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (lines.size() == 0) { 42496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project // unknown problem, throw exception 42596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throw new IOException( 42696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "Command line did not return any info " + 42796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "for command " + Arrays.asList(cmdAttribs)); 42896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 42996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return lines; 43096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 43196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } catch (InterruptedException ex) { 43296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project throw new IOException( 43396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "Command line threw an InterruptedException '" + ex.getMessage() + 43496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project "' for command " + Arrays.asList(cmdAttribs)); 43596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } finally { 43696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project IOUtils.closeQuietly(in); 43796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project IOUtils.closeQuietly(out); 43896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project IOUtils.closeQuietly(err); 43996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project IOUtils.closeQuietly(inr); 44096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (proc != null) { 44196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project proc.destroy(); 44296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 44396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 44496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 44596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 44696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project /** 44796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Opens the process to the operating system. 44896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 44996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @param cmdAttribs the command line parameters 45096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @return the process 45196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @throws IOException if an error occurs 45296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 45396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project Process openProcess(String[] cmdAttribs) throws IOException { 45496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return Runtime.getRuntime().exec(cmdAttribs); 45596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 45696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 45796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project} 458