From 2c8b6316d2e6367acaaff6bb071dec26759dbd0b Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 17 Jan 2025 03:10:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DFileUtil.isAbsolutePath?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E5=88=A4=E6=96=ADsmb=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=88pr#1299@Gitee=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/io/file/FileNameUtil.java | 16 ++++++--- .../dromara/hutool/core/io/file/FileUtil.java | 3 +- .../hutool/core/io/file/FileUtilTest.java | 35 ++++++++++++------- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/file/FileNameUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/file/FileNameUtil.java index 5e669c51d..e11c95ed7 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/file/FileNameUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/file/FileNameUtil.java @@ -65,6 +65,11 @@ public class FileNameUtil { */ public static final char WINDOWS_SEPARATOR = CharUtil.BACKSLASH; + /** + * windows的共享文件夹开头 + */ + public static final String SMB_PATH_PREFIX = "\\\\"; + /** * Windows下文件名中的无效字符 */ @@ -75,8 +80,7 @@ public class FileNameUtil { */ private static final CharSequence[] SPECIAL_SUFFIX = {"tar.bz2", "tar.Z", "tar.gz", "tar.xz"}; - - // -------------------------------------------------------------------------------------------- name start + // region ----- getName /** * 返回文件名 @@ -126,7 +130,9 @@ public class FileNameUtil { return filePath.substring(begin, len); } + // endregion + // region ----- prefix and suffix /** * 获取文件后缀名,扩展名不带“.” * @@ -191,7 +197,9 @@ public class FileNameUtil { public static String getPrefix(final String fileName) { return mainName(fileName); } + // endregion + // region ----- mainName and extName /** * 返回主文件名 * @@ -292,6 +300,7 @@ public class FileNameUtil { return StrUtil.containsAny(ext, UNIX_SEPARATOR, WINDOWS_SEPARATOR) ? StrUtil.EMPTY : ext; } } + // endregion /** * 清除文件名中的在Windows下不支持的非法字符,包括: \ / : * ? " < > | @@ -367,7 +376,7 @@ public class FileNameUtil { } //兼容Windows下的共享目录路径(原始路径如果以\\开头,则保留这种路径) - if (path.startsWith("\\\\")) { + if (path.startsWith(SMB_PATH_PREFIX)) { return path; } @@ -454,5 +463,4 @@ public class FileNameUtil { } return pathElements; } - // -------------------------------------------------------------------------------------------- name end } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/file/FileUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/file/FileUtil.java index 205603703..855edabd3 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/file/FileUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/file/FileUtil.java @@ -1268,6 +1268,7 @@ public class FileUtil { *
  • 以/开头的路径
  • *
  • 满足类似于 c:/xxxxx,其中祖母随意,不区分大小写
  • *
  • 满足类似于 d:\xxxxx,其中祖母随意,不区分大小写
  • + *
  • 满足windows SMB协议格式,如: \\192.168.1.1\Share
  • * * * @param path 需要检查的Path @@ -1279,7 +1280,7 @@ public class FileUtil { } // 给定的路径已经是绝对路径了 - return CharUtil.SLASH == path.charAt(0) || ReUtil.isMatch(PATTERN_PATH_ABSOLUTE, path); + return CharUtil.SLASH == path.charAt(0) || path.startsWith(FileNameUtil.SMB_PATH_PREFIX) || ReUtil.isMatch(PATTERN_PATH_ABSOLUTE, path); } // endregion diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/io/file/FileUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/io/file/FileUtilTest.java index 9d450004b..6d3c1c5b8 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/io/file/FileUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/io/file/FileUtilTest.java @@ -27,9 +27,11 @@ import org.junit.jupiter.api.condition.EnabledForJreRange; import org.junit.jupiter.api.condition.JRE; import java.io.File; +import java.nio.file.Paths; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * {@link FileUtil} 单元测试类 @@ -61,7 +63,7 @@ public class FileUtilTest { Assertions.assertEquals(absolutePath, absolutePath2); String path = FileUtil.getAbsolutePath("中文.xml"); - Assertions.assertTrue(path.contains("中文.xml")); + assertTrue(path.contains("中文.xml")); path = FileUtil.getAbsolutePath("d:"); Assertions.assertEquals("d:", path); @@ -108,7 +110,7 @@ public class FileUtilTest { FileUtil.copy(srcFile, destFile, true); - Assertions.assertTrue(destFile.exists()); + assertTrue(destFile.exists()); Assertions.assertEquals(srcFile.length(), destFile.length()); } @@ -147,7 +149,7 @@ public class FileUtilTest { final File destFile = FileUtil.file("d:/hutool.jpg"); final boolean equals = FileUtil.equals(srcFile, destFile); - Assertions.assertTrue(equals); + assertTrue(equals); // 源文件存在,目标文件不存在 final File srcFile1 = FileUtil.file("hutool.jpg"); @@ -224,13 +226,13 @@ public class FileUtilTest { public void listFileNamesTest() { // JDK9+中,由于模块化问题,获取的classoath路径非项目下,而是junit下的。 List names = FileUtil.listFileNames("classpath:"); - Assertions.assertTrue(names.contains("hutool.jpg")); + assertTrue(names.contains("hutool.jpg")); names = FileUtil.listFileNames(""); - Assertions.assertTrue(names.contains("hutool.jpg")); + assertTrue(names.contains("hutool.jpg")); names = FileUtil.listFileNames("."); - Assertions.assertTrue(names.contains("hutool.jpg")); + assertTrue(names.contains("hutool.jpg")); } @Test @@ -401,7 +403,7 @@ public class FileUtilTest { mimeType = FileUtil.getMimeType("test.js"); // 在 jdk 11+ 会获取到 text/javascript,而非 自定义的 application/x-javascript final List list = ListUtil.of("text/javascript", "application/x-javascript"); - Assertions.assertTrue(list.contains(mimeType)); + assertTrue(list.contains(mimeType)); // office03 mimeType = FileUtil.getMimeType("test.doc"); @@ -439,7 +441,7 @@ public class FileUtilTest { public void isSubRelativeTest() { final File file = new File(".."); final File file2 = new File("."); - Assertions.assertTrue(FileUtil.isSub(file, file2)); + assertTrue(FileUtil.isSub(file, file2)); } @Test @@ -452,14 +454,14 @@ public class FileUtilTest { @Test public void createTempFileTest() { final File nullDirTempFile = FileUtil.createTempFile(); - Assertions.assertTrue(nullDirTempFile.exists()); + assertTrue(nullDirTempFile.exists()); final File suffixDirTempFile = FileUtil.createTempFile(".xlsx", true); Assertions.assertEquals("xlsx", FileNameUtil.getSuffix(suffixDirTempFile)); final File prefixDirTempFile = FileUtil.createTempFile("prefix", ".xlsx", true); Console.log(prefixDirTempFile); - Assertions.assertTrue(FileNameUtil.getPrefix(prefixDirTempFile).startsWith("prefix")); + assertTrue(FileNameUtil.getPrefix(prefixDirTempFile).startsWith("prefix")); } @Test @@ -487,18 +489,27 @@ public class FileUtilTest { public void issue3591Test() { // 此文件最后一行末尾无换行符 final int totalLines = FileUtil.getTotalLines(FileUtil.file("1_psi_index_0.txt")); - Assertions.assertEquals(11, totalLines); + assertEquals(11, totalLines); } @Test public void isAbsolutePathTest() { String path = "d:/test\\aaa.txt"; - Assertions.assertTrue(FileUtil.isAbsolutePath(path)); + assertTrue(FileUtil.isAbsolutePath(path)); path = "test\\aaa.txt"; Assertions.assertFalse(FileUtil.isAbsolutePath(path)); } + @Test + public void smbPathTest() { + final String smbPath = "\\\\192.168.1.1\\share\\rc-source"; + final String parseSmbPath = FileUtil.getAbsolutePath(smbPath); + assertEquals(smbPath, parseSmbPath); + assertTrue(FileUtil.isAbsolutePath(smbPath)); + assertTrue(Paths.get(smbPath).isAbsolute()); + } + @Test @Disabled void readBytesTest() {