如何在 kotlin/java 中比较两个路径的文件系统?

问题描述 投票:0回答:1

我想知道如何检查两个不同路径的文件系统是否相等。这样写好像是错误的

path1.fileSystem == path2.fileSystem

因为可能存在这样的情况:文件系统在含义上是相同的(它们完全相同),但实际上是不同的实例,因此当它实际上必须返回

path1.fileSystem == path2.fileSystem
时,
false
可能会返回
true
。那我应该如何比较两个不同路径的文件系统呢?或者
==
实际上没问题并且在这种情况下可以正常工作吗?

我实际上尝试询问 ChatGPT,但它给了我一个奇怪的解决方案,似乎不起作用

boolean sameFileSystem = FileSystems.getDefault().provider().getScheme().equals(path1.getFileSystem().provider().getScheme())
                && FileSystems.getDefault().provider().getScheme().equals(path2.getFileSystem().provider().getScheme());


更新:我需要检查这一点,以便解决一条路径与另一条路径的冲突 (如果文件系统不一样我就做点别的,这部分是无关紧要的?我只需要检查它们是否相同)

java kotlin path filesystems nio
1个回答
0
投票

如果您想知道是否可以安全地调用两个现有 .resolve(Path)

 实例的 
Path
,您必须检查这两个路径是否属于同一个 provider,而不是文件系统。

可以使用

==
运算符来比较提供商;他们应该是单身人士。

为了比较,这是

Files.copy(…)
检查两个路径是否属于同一个文件系统提供程序的方式:

public static Path copy(Path source, Path target, CopyOption... options)
    throws IOException
{
    FileSystemProvider provider = provider(source);
    if (provider(target) == provider) {
        // same provider
        provider.copy(source, target, options);
    } else {
        // different providers
        CopyMoveHelper.copyToForeignTarget(source, target, options);
    }
    return target;
}

private static FileSystemProvider provider(Path path) {
    return path.getFileSystem().provider();
}

在大多数情况下,当您需要使用不同文件系统提供程序的路径进行解析时,可以使用

.resolve(String)
进行回退:

static Path resolveWithForeignSupport(Path base, Path other) {
    FileSystem fs1 = base.getFileSystem(), fs2 = other.getFileSystem();

    if(fs1.provider() == fs2.provider()) {
        return base.resolve(other);
    }

    if(other.getNameCount() <= 1 || fs1.getSeparator().equals(fs2.getSeparator())){
        return base.resolve(other.toString());
    }

    Path resolved = base, othersRoot = other.getRoot();
    if(othersRoot != null) {
        resolved = resolved.resolve(othersRoot.toString());
    }
    for(Path component: other) {
        resolved = resolved.resolve(component.toString());
    }
    return resolved;
}
© www.soinside.com 2019 - 2024. All rights reserved.