为任何给定路径获取FileStore对象

3

编辑:我意识到FileSystem.getDefault()会给我我在原始问题声明中所要寻找的东西。我尝试使用FileSystem.getFileSystem(URI)来获取任何给定路径的FileSystem。

我正在尝试开发一些代码,以便为给定路径获得java.nio.file.FileSystem对象。

以下是一些极度简化的示例代码,以更好地说明正在尝试的内容:

public FileSystem getCwdFilesystem()
{
    URI cwdUri = null;
    String delimiter = "";
    try
    {
        _cwd = System.getProperty("user.dir");
        cwdUri = new URI("file", delimiter + _cwd, null);
    }
    catch (URISyntaxException ue)
    {
        System.out.println("URI Creation failure on URI: " + _cwd);
        ue.printStackTrace();
        System.exit(1);
    }

    System.out.println("Filestore data for CWD: " + cwdUri.toString());

    return (FileSystems.getFileSystem(cwdUri));
}

执行时,在代码的最后一行抛出了一个异常。
Filestore data for CWD: file:/Users/redacted/Documents/Java%20Projects/ExampleCode
Exception in thread "main" java.lang.IllegalArgumentException: Path component should be '/'
    at sun.nio.fs.UnixFileSystemProvider.checkUri(UnixFileSystemProvider.java:77)
    at sun.nio.fs.UnixFileSystemProvider.getFileSystem(UnixFileSystemProvider.java:92)
    at java.nio.file.FileSystems.getFileSystem(FileSystems.java:217)
    at examplecode.FilesystemCapacity.getCwdFilesystem(FilesystemCapacity.java:54)
    at examplecode.FilesystemCapacity.main(FilesystemCapacity.java:33)
Java Result: 1

当我对分隔符变量进行小的更新时:
String delimiter = "/";

我从同一位置获得了不同的错误信息:

Filestore data for CWD: file://Users/redacted/Documents/Java%20Projects/ExampleCode
Exception in thread "main" java.lang.IllegalArgumentException: Authority component present
    at sun.nio.fs.UnixFileSystemProvider.checkUri(UnixFileSystemProvider.java:73)
    at sun.nio.fs.UnixFileSystemProvider.getFileSystem(UnixFileSystemProvider.java:92)
    at java.nio.file.FileSystems.getFileSystem(FileSystems.java:217)
    at examplecode.FilesystemCapacity.getCwdFilesystem(FilesystemCapacity.java:54)
    at examplecode.FilesystemCapacity.main(FilesystemCapacity.java:33)
Java Result: 1

将额外的“/”字符添加到分隔符中只会让我再次收到第一个错误消息。我做错了什么?

如果您将"./"作为分隔符添加会发生什么? - mdewitt
不幸的是,错误信息变为了“路径组件未定义”。 - Chuck Wolber
1
你应该使用File.separator而不是delimiter。 - Melih Altıntaş
1个回答

4

我发现了一个之前错过的参考链接(在NIO.2文档中的最后一页)

我编写了一些测试代码,得到了我需要的结果:

    public void getPathFilesystem(String path)
    {
        try
        {
            URI rootURI = new URI("file:///");
            Path rootPath = Paths.get(rootURI);
            Path dirPath = rootPath.resolve(path);
            FileStore dirFileStore = Files.getFileStore(dirPath);

            printFileStore(dirFileStore, path);
        }
        catch (IOException | URISyntaxException e)
        {
            e.printStackTrace();
        }
    }

    public void printFileStore(FileStore filestore, String path)
    {
        try
        {
            System.out.println("Name: " + filestore.name());
            System.out.println("\tPath: " + path);
            System.out.println("\tSize: " + filestore.getTotalSpace());
            System.out.println("\tUnallocated: " + filestore.getUnallocatedSpace());
            System.out.println("\tUsable: " + filestore.getUsableSpace());
            System.out.println("\tType: " + filestore.type());
        }
        catch (IOException ioe)
        {
            ioe.printStackTrace();
        }
    }

1
感谢您提到resolve;文档确实说明这样做很重要,但有点晦涩。 - David J.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接