    001/*
    002 * Licensed to the Apache Software Foundation (ASF) under one or more
    003 * contributor license agreements.  See the NOTICE file distributed with
    004 * this work for additional information regarding copyright ownership.
    005 * The ASF licenses this file to You under the Apache License, Version 2.0
    006 * (the "License"); you may not use this file except in compliance with
    007 * the License.  You may obtain a copy of the License at
    008 *
    009 *      https://www.apache.org/licenses/LICENSE-2.0
    010 *
    011 * Unless required by applicable law or agreed to in writing, software
    012 * distributed under the License is distributed on an "AS IS" BASIS,
    013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014 * See the License for the specific language governing permissions and
    015 * limitations under the License.
    016 */
    017package org.apache.commons.io;
    018
    019import java.io.File;
    020import java.io.IOException;
    021import java.nio.file.Files;
    022import java.nio.file.Path;
    023import java.nio.file.Paths;
    024import java.util.Objects;
    025
    026/**
    027 * General File System utilities.
    028 * <p>
    029 * This class provides static utility methods for general file system functions not provided before Java 6's {@link File File} class.
    030 * </p>
    031 * <p>
    032 * The current functions provided are:
    033 * </p>
    034 * <ul>
    035 * <li>Get the free space on a drive</li>
    036 * </ul>
    037 *
    038 * @since 1.1
    039 * @deprecated As of 2.6 deprecated without replacement. Use equivalent methods in {@link java.nio.file.FileStore} instead,
    040 *             {@code Files.getFileStore(Paths.get("/home")).getUsableSpace()} or iterate over {@code FileSystems.getDefault().getFileStores()}
    041 */
    042@Deprecated
    043public class FileSystemUtils {
    044
    045    /**
    046     * Gets the number of kibibytes (1024 bytes) available to this Java virtual machine on the given file store.
    047     * <p>
    048     * Note that some OS's are NOT currently supported, including OS/390, OpenVMS.
    049     * </p>
    050     *
    051     * <pre>
    052     * FileSystemUtils.freeSpace("C:"); // Windows
    053     * FileSystemUtils.freeSpace("/volume"); // *nix
    054     * </pre>
    055     *
    056     * @param path the path to get free space for, not null, not empty on Unix.
    057     * @return the amount of free drive space on the drive or volume.
    058     * @throws IOException              if an I/O error occurs.
    059     * @throws IllegalArgumentException if the path is invalid.
    060     * @since 1.1, enhanced OS support in 1.2 and 1.3
    061     * @deprecated Use freeSpaceKb(String) Deprecated from 1.3, may be removed in 2.0.
    062     */
    063    @Deprecated
    064    public static long freeSpace(final String path) throws IOException {
    065        return getFreeSpace(path);
    066    }
    067
    068    /**
    069     * Gets the number of kibibytes (1024 bytes) available to this Java virtual machine on the current file store.
    070     * <p>
    071     * Identical to:
    072     * </p>
    073     *
    074     * <pre>
    075     * freeSpaceKb(FileUtils.current().getAbsolutePath())
    076     * </pre>
    077     *
    078     * @return the amount of free drive space on the drive or volume in kilobytes.
    079     * @throws IOException              if an I/O error occurs.
    080     * @throws IllegalArgumentException if the path is invalid.
    081     * @since 2.0
    082     * @deprecated As of 2.6 deprecated without replacement. Please use {@link java.nio.file.FileStore#getUsableSpace()}.
    083     */
    084    @Deprecated
    085    public static long freeSpaceKb() throws IOException {
    086        return freeSpaceKb(-1);
    087    }
    088
    089    /**
    090     * Gets the number of kibibytes (1024 bytes) available to this Java virtual machine on the current file store.
    091     * <p>
    092     * Identical to:
    093     * </p>
    094     *
    095     * <pre>
    096     * freeSpaceKb(FileUtils.current().getAbsolutePath())
    097     * </pre>
    098     *
    099     * @param timeout ignored.
    100     * @return the amount of free drive space on the drive or volume in kilobytes.
    101     * @throws IOException              if an I/O error occurs.
    102     * @throws IllegalArgumentException if the path is invalid.
    103     * @since 2.0
    104     * @deprecated As of 2.6 deprecated without replacement. Please use {@link java.nio.file.FileStore#getUsableSpace()}.
    105     */
    106    @Deprecated
    107    public static long freeSpaceKb(final long timeout) throws IOException {
    108        return freeSpaceKb(FileUtils.current().getAbsolutePath(), timeout);
    109    }
    110
    111    /**
    112     * Gets the number of kibibytes (1024 bytes) available to this Java virtual machine on the given file store.
    113     *
    114     * <pre>
    115     * FileSystemUtils.freeSpaceKb("C:"); // Windows
    116     * FileSystemUtils.freeSpaceKb("/volume"); // *nix
    117     * </pre>
    118     *
    119     * @param path the path to get free space for, not null, not empty on Unix.
    120     * @return the amount of free drive space on the drive or volume in kilobytes.
    121     * @throws IOException              if an I/O error occurs.
    122     * @throws IllegalArgumentException if the path is invalid.
    123     * @since 1.2, enhanced OS support in 1.3
    124     * @deprecated As of 2.6 deprecated without replacement. Please use {@link java.nio.file.FileStore#getUsableSpace()}.
    125     */
    126    @Deprecated
    127    public static long freeSpaceKb(final String path) throws IOException {
    128        return freeSpaceKb(path, -1);
    129    }
    130
    131    /**
    132     * Gets the number of kibibytes (1024 bytes) available to this Java virtual machine on the given file store.
    133     *
    134     * <pre>
    135     * FileSystemUtils.freeSpaceKb("C:"); // Windows
    136     * FileSystemUtils.freeSpaceKb("/volume"); // *nix
    137     * </pre>
    138     *
    139     * @param path    the path to get free space for, not null, not empty on Unix.
    140     * @param timeout ignored.
    141     * @return the amount of free drive space on the drive or volume in kilobytes.
    142     * @throws IOException              if an I/O error occurs.
    143     * @throws IllegalArgumentException if the path is invalid.
    144     * @since 2.0
    145     * @deprecated As of 2.6 deprecated without replacement. Please use {@link java.nio.file.FileStore#getUsableSpace()}.
    146     */
    147    @Deprecated
    148    public static long freeSpaceKb(final String path, final long timeout) throws IOException {
    149        return getFreeSpace(path) / FileUtils.ONE_KB;
    150    }
    151
    152    /**
    153     * Gets the number of bytes available to this Java virtual machine on the given file store.
    154     *
    155     * <pre>
    156     * FileSystemUtils.freeSpace("C:"); // Windows
    157     * FileSystemUtils.freeSpace("/volume"); // *nix
    158     * </pre>
    159     *
    160     * @param pathStr the path to get free space for, not null, not empty on Unix.
    161     * @return the amount of free drive space on the drive or volume.
    162     * @throws IOException              if an I/O error occurs.
    163     * @throws IllegalArgumentException if the path is invalid.
    164     */
    165    static long getFreeSpace(final String pathStr) throws IOException {
    166        final Path path = Paths.get(Objects.requireNonNull(pathStr, "pathStr"));
    167        if (Files.exists(path)) {
    168            // Need an absolute path for input like "" to work
    169            return Files.getFileStore(path.toAbsolutePath()).getUsableSpace();
    170            // return path.toAbsolutePath().toFile().getUsableSpace();
    171        }
    172        throw new IllegalArgumentException(path.toString());
    173    }
    174
    175    /**
    176     * Instances should NOT be constructed in standard programming.
    177     *
    178     * @deprecated TODO Make private in 3.0.
    179     */
    180    @Deprecated
    181    public FileSystemUtils() {
    182        // empty
    183    }
    184
    185}