3

我需要为系统中的所有磁盘或所有分区获取可用的可用磁盘空间,我不介意。(我不必使用 Sigar,但我已经在项目中将它用于其他一些流程,所以我也可以使用它)我正在使用 Sigar API 并得到了这个

public double getFreeHdd() throws SigarException{
        FileSystemUsage f= sigar.getFileSystemUsage("/");
        return ( f.getAvail()); 
    }

但这只给了我系统分区(根),我怎样才能得到所有分区的列表并循环它们以获得它们的可用空间?我试过这个

FileSystemView fsv = FileSystemView.getFileSystemView();
        File[] roots = fsv.getRoots();
        for (int i = 0; i < roots.length; i++) {
            System.out.println("Root: " + roots[i]);
        }

但它只返回根目录

根: /

谢谢

编辑 它似乎我可以使用 FileSystem[] fslist = sigar.getFileSystemList();
但我得到的结果与我从终端得到的结果不匹配。另一方面,在我正在开发的这个系统上,我有 3 个磁盘,总共 12 个分区,所以我可能会在那里丢失一些东西。将在其他系统上尝试它,以防我可以从结果中做出有用的东西。

4

2 回答 2

2

我们广泛使用 SIGAR 进行跨平台监控。这是我们用来获取文件系统列表的代码:

/**
* @return a list of directory path names of file systems that are local or network - not removable media
*/
public static Set<String> getLocalOrNetworkFileSystemDirectoryNames() {
  Set<String> ret = new HashSet<String>();
  try {
    FileSystem[] fileSystemList = getSigarProxy().getFileSystemList();

    for (FileSystem fs : fileSystemList) {
      if ((fs.getType() == FileSystem.TYPE_LOCAL_DISK) || (fs.getType() == FileSystem.TYPE_NETWORK)) {
        ret.add(fs.getDirName());
      }
    }
  }
  catch (SigarException e) {
    // log or rethrow as appropriate
  }

  return ret;
}

然后,您可以将其用作其他 SIGAR 方法的输入:

FileSystemUsage usageStats = getSigarProxy().getFileSystemUsage(fileSystemDirectoryPath);

getSigarProxy()只是一个方便的基本方法:

// The Humidor handles thread safety for a single instance of a Sigar object
static final private SigarProxy sigarProxy = Humidor.getInstance().getSigar();

static final protected SigarProxy getSigarProxy() {
  return sigarProxy;
}
于 2016-02-17T16:55:39.813 回答
0

您可以使用java.nio.file.FileSystems获取列表java.nio.file.FileStorages然后查看可用/可用空间。每个实例(假设您使用的是 Java 7+):

import java.io.IOException;
import java.nio.file.FileStore;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.util.function.Consumer;

public static void main(String[] args) {
    FileSystem fs = FileSystems.getDefault();
    fs.getFileStores().forEach(new Consumer<FileStore>() {
        @Override
        public void accept(FileStore store) {
            try {
                System.out.println(store.getTotalSpace());
                System.out.println(store.getUsableSpace());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });
}

另外,请记住,它FileStore.getUsableSpace()以字节为单位返回大小。有关更多信息,请参阅文档。

于 2016-02-17T16:35:54.060 回答