From bee3056844a0ae336a5b35d97b56f92206f7630a Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 12 Jul 2021 10:08:17 +0800 Subject: [PATCH] fix normalize --- CHANGELOG.md | 3 ++- .../src/main/java/cn/hutool/core/io/FileUtil.java | 11 ++++++++++- .../test/java/cn/hutool/core/io/FileUtilTest.java | 15 +++++++++++---- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6fa38446c..94d8c40a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,11 +3,12 @@ ------------------------------------------------------------------------------------------------------------- -# 5.7.5 (2021-07-10) +# 5.7.5 (2021-07-12) ### 🐣新特性 ### 🐞Bug修复 +* 【core 】 修复FileUtil.normalize处理上级路径的问题(issue#I3YPEH@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java index 36d527ce5..731e3dca9 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java @@ -1456,9 +1456,9 @@ public class FileUtil extends PathUtil { } List pathList = StrUtil.split(pathToUse, StrUtil.C_SLASH); + List pathElements = new LinkedList<>(); int tops = 0; - String element; for (int i = pathList.size() - 1; i >= 0; i--) { element = pathList.get(i); @@ -1478,6 +1478,15 @@ public class FileUtil extends PathUtil { } } + // issue#1703@Github + if(tops > 0){ + while (tops-- > 0){ + //遍历完节点发现还有上级标注(即开头有一个或多个..),补充之 + // Normal path element found. + pathElements.add(0, StrUtil.DOUBLE_DOT); + } + } + return prefix + CollUtil.join(pathElements, StrUtil.SLASH); } diff --git a/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java index 2858bbc55..c628b68d1 100644 --- a/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java @@ -147,15 +147,16 @@ public class FileUtilTest { Assert.assertEquals("/bar", FileUtil.normalize("/foo/../bar")); Assert.assertEquals("/bar/", FileUtil.normalize("/foo/../bar/")); Assert.assertEquals("/baz", FileUtil.normalize("/foo/../bar/../baz")); - Assert.assertEquals("/", FileUtil.normalize("/../")); + Assert.assertEquals("/../", FileUtil.normalize("/../")); Assert.assertEquals("foo", FileUtil.normalize("foo/bar/..")); - Assert.assertEquals("bar", FileUtil.normalize("foo/../../bar")); + Assert.assertEquals("../bar", FileUtil.normalize("foo/../../bar")); Assert.assertEquals("bar", FileUtil.normalize("foo/../bar")); Assert.assertEquals("/server/bar", FileUtil.normalize("//server/foo/../bar")); Assert.assertEquals("/bar", FileUtil.normalize("//server/../bar")); Assert.assertEquals("C:/bar", FileUtil.normalize("C:\\foo\\..\\bar")); - Assert.assertEquals("C:/bar", FileUtil.normalize("C:\\..\\bar")); - Assert.assertEquals("bar", FileUtil.normalize("../../bar")); + // + Assert.assertEquals("C:/../bar", FileUtil.normalize("C:\\..\\bar")); + Assert.assertEquals("../../bar", FileUtil.normalize("../../bar")); Assert.assertEquals("C:/bar", FileUtil.normalize("/C:/bar")); Assert.assertEquals("C:", FileUtil.normalize("C:")); Assert.assertEquals("\\/192.168.1.1/Share/", FileUtil.normalize("\\\\192.168.1.1\\Share\\")); @@ -184,6 +185,12 @@ public class FileUtilTest { Assert.assertEquals("", FileUtil.normalize("classpath:")); } + @Test + public void normalizeClassPathTest2() { + Assert.assertEquals("../a/b.csv", FileUtil.normalize("../a/b.csv")); + Assert.assertEquals("../../../a/b.csv", FileUtil.normalize("../../../a/b.csv")); + } + @Test public void doubleNormalizeTest() { String normalize = FileUtil.normalize("/aa/b:/c");