首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于Windows 10上的两个不同文件夹(小写m和大写M),Path.equals()返回true

对于Windows 10上的两个不同文件夹(小写m和大写M),Path.equals()返回true
EN

Stack Overflow用户
提问于 2017-04-23 13:16:34
回答 2查看 805关注 0票数 1

我创建了一个文件索引器,它在Windows 7和Ubuntu中运行得很好。

自从我迁移到Windows 10之后,我的代码就一直在一个特定的文件夹C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo上抛出错误

此文件夹之所以特殊,是因为它包含具有小写和大写名称的文件夹,如果小写,这些名称是相同的。

问题是,我已经查看了所有的代码基,它没有equalsIgnoreCasetoLowerCasetoUpperCase的实例。

最后,我得出结论,Path.equals对于两个不同的文件夹返回true,这是不应该的。这在我的代码中造成了一个问题,因为Path被用作代码中任何地方的Map键,特别是在我的索引器实现中,这会导致Collectors.groupingBy将属于不同文件夹的文件分组到同一个文件夹中:

代码语言:javascript
复制
    Map<Path, List<DetailedFileReference>> parentFolderToDetailList = finderResult.getDetails().stream()
            .collect(Collectors.groupingBy(o -> o.asPathObject().getParent()));

我想出了复制步骤:

代码语言:javascript
复制
Path originFolder = Paths.get("C:\\Users\\Terminal\\AppData\\Local\\lxss\\rootfs\\usr\\share\\terminfo");
Path lowercaseFolder = originFolder.resolve("m");
Path uppercaseFolder = originFolder.resolve("M");

if (lowercaseFolder.equals(uppercaseFolder)) {
    System.out.println(lowercaseFolder.toString() + " is equal to " + uppercaseFolder.toString());
}

此代码打印:

代码语言:javascript
复制
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\m is equal to C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\M

但是,其他Java代码确实看到了这两个文件夹之间的区别,因为Files.walk工作得很好:

代码语言:javascript
复制
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public final class DuplicateFileIndexing {
    public static void main(String[] args) throws IOException {
        Path originFolder = Paths.get("C:\\Users\\Terminal\\AppData\\Local\\lxss\\rootfs\\usr\\share\\terminfo");
        Path lowercaseFolder = originFolder.resolve("m");
        Path uppercaseFolder = originFolder.resolve("M");

        System.out.println(originFolder.toAbsolutePath().toString());

        List<String> directoriesInOriginFolder = Files.walk(originFolder, 1)
                .filter(path -> Files.isDirectory(path))
                .map(path -> path.getFileName().toString())
                .collect(Collectors.toList());
        System.out.println(directoriesInOriginFolder);

        if (directoriesInOriginFolder.contains("m")) {
            System.out.println("Has a m folder");
        }
        if (directoriesInOriginFolder.contains("M")) {
            System.out.println("Has a M folder");
        }

        System.out.println("---");

        System.out.println("Files in 'm' folder");
        Files.walk(lowercaseFolder, 1)
                .map(path -> path.toAbsolutePath().toString())
                .forEach(System.out::println);

        System.out.println("---");

        System.out.println("Files in 'M' folder");
        Files.walk(uppercaseFolder, 1)
                .map(path -> path.toAbsolutePath().toString())
                .forEach(System.out::println);

        System.out.println("---");

        System.out.println("Parent of files in 'm' folder");
        Files.walk(lowercaseFolder, 1)
                .map(path -> path.toAbsolutePath().toString() + " is a child of " + path.getParent().toString())
                .forEach(System.out::println);

        System.out.println("---");

        System.out.println("Parent of files in 'M' folder");
        Files.walk(uppercaseFolder, 1)
                .map(path -> path.toAbsolutePath().toString() + " is a child of " + path.getParent().toString())
                .forEach(System.out::println);

        System.out.println("---");

        if (lowercaseFolder.equals(uppercaseFolder)) {
            System.out.println(lowercaseFolder.toString() + " is equal to " + uppercaseFolder.toString());
        }
    }
}

这些指纹:

代码语言:javascript
复制
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo
[terminfo, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, a, b, c, d, E, e, f, g, h, i, j, k, L, l, M, m, N, n, o, P, p, Q, q, r, s, t, u, v, w, X, x, z]
Has a m folder
Has a M folder
---
Files in 'm' folder
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\m
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\m\MtxOrb
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\m\MtxOrb162
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\m\MtxOrb204
---
Files in 'M' folder
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\M
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\M\MtxOrb
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\M\MtxOrb162
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\M\MtxOrb204
---
Parent of files in 'm' folder
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\m is a child of C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\m\MtxOrb is a child of C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\m
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\m\MtxOrb162 is a child of C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\m
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\m\MtxOrb204 is a child of C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\m
---
Parent of files in 'M' folder
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\M is a child of C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\M\MtxOrb is a child of C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\M
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\M\MtxOrb162 is a child of C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\M
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\M\MtxOrb204 is a child of C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\M
---
C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\m is equal to C:\Users\Terminal\AppData\Local\lxss\rootfs\usr\share\terminfo\M

根据文档,Path.equals

两个路径是否相等取决于文件系统的实现。在某些情况下,对路径进行比较而不考虑情况,而其他情况则是区分大小写的。

我如何修复我的代码或JVM,以便Path.equals为两个不同的文件夹返回false (按情况而定)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-23 19:26:33

对于NTFS中的几乎所有其他位置,Path.equals都是正确的。但是,"LXSS“文件是使用正常Windows以外的其他工具创建的(例如NtCreateFile使用属性 )。

如果您尝试在Windows中浏览"M“和"m”,您会注意到您只能进入其中一个,因为它们的内容似乎是相同的。因此,不仅AppData的某些部分难以区分,而且一些部分没有一点魔力是无法访问的。

票数 1
EN

Stack Overflow用户

发布于 2017-04-23 13:31:29

JavaDoc for Path::equals声明:

两个路径是否相等取决于文件系统的实现。在某些情况下,对路径进行比较而不考虑情况,而其他情况则是区分大小写的。此方法不访问文件系统,也不要求文件存在。在需要的地方,可以使用isSameFile方法来检查两个路径是否找到同一个文件。

由于您的Path没有就FileSystem进行测试,所以您应该使用文件::isSameFile

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43571659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档