修复FileUtil.isAbsolutePath没有判断smb路径问题(pr#1299@Gitee)

This commit is contained in:
Looly 2025-01-17 03:10:07 +08:00
parent 187e42cc9f
commit 2c8b6316d2
3 changed files with 37 additions and 17 deletions

View File

@ -65,6 +65,11 @@ public class FileNameUtil {
*/ */
public static final char WINDOWS_SEPARATOR = CharUtil.BACKSLASH; public static final char WINDOWS_SEPARATOR = CharUtil.BACKSLASH;
/**
* windows的共享文件夹开头
*/
public static final String SMB_PATH_PREFIX = "\\\\";
/** /**
* Windows下文件名中的无效字符 * Windows下文件名中的无效字符
*/ */
@ -75,8 +80,7 @@ public class FileNameUtil {
*/ */
private static final CharSequence[] SPECIAL_SUFFIX = {"tar.bz2", "tar.Z", "tar.gz", "tar.xz"}; private static final CharSequence[] SPECIAL_SUFFIX = {"tar.bz2", "tar.Z", "tar.gz", "tar.xz"};
// region ----- getName
// -------------------------------------------------------------------------------------------- name start
/** /**
* 返回文件名 * 返回文件名
@ -126,7 +130,9 @@ public class FileNameUtil {
return filePath.substring(begin, len); return filePath.substring(begin, len);
} }
// endregion
// region ----- prefix and suffix
/** /**
* 获取文件后缀名扩展名不带. * 获取文件后缀名扩展名不带.
* *
@ -191,7 +197,9 @@ public class FileNameUtil {
public static String getPrefix(final String fileName) { public static String getPrefix(final String fileName) {
return mainName(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; return StrUtil.containsAny(ext, UNIX_SEPARATOR, WINDOWS_SEPARATOR) ? StrUtil.EMPTY : ext;
} }
} }
// endregion
/** /**
* 清除文件名中的在Windows下不支持的非法字符包括 \ / : * ? " < > | * 清除文件名中的在Windows下不支持的非法字符包括 \ / : * ? " < > |
@ -367,7 +376,7 @@ public class FileNameUtil {
} }
//兼容Windows下的共享目录路径原始路径如果以\\开头则保留这种路径 //兼容Windows下的共享目录路径原始路径如果以\\开头则保留这种路径
if (path.startsWith("\\\\")) { if (path.startsWith(SMB_PATH_PREFIX)) {
return path; return path;
} }
@ -454,5 +463,4 @@ public class FileNameUtil {
} }
return pathElements; return pathElements;
} }
// -------------------------------------------------------------------------------------------- name end
} }

View File

@ -1268,6 +1268,7 @@ public class FileUtil {
* <li>/开头的路径</li> * <li>/开头的路径</li>
* <li>满足类似于 c:/xxxxx其中祖母随意不区分大小写</li> * <li>满足类似于 c:/xxxxx其中祖母随意不区分大小写</li>
* <li>满足类似于 d:\xxxxx其中祖母随意不区分大小写</li> * <li>满足类似于 d:\xxxxx其中祖母随意不区分大小写</li>
* <li>满足windows SMB协议格式: \\192.168.1.1\Share</li>
* </ul> * </ul>
* *
* @param path 需要检查的Path * @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 // endregion

View File

@ -27,9 +27,11 @@ import org.junit.jupiter.api.condition.EnabledForJreRange;
import org.junit.jupiter.api.condition.JRE; import org.junit.jupiter.api.condition.JRE;
import java.io.File; import java.io.File;
import java.nio.file.Paths;
import java.util.List; import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
/** /**
* {@link FileUtil} 单元测试类 * {@link FileUtil} 单元测试类
@ -61,7 +63,7 @@ public class FileUtilTest {
Assertions.assertEquals(absolutePath, absolutePath2); Assertions.assertEquals(absolutePath, absolutePath2);
String path = FileUtil.getAbsolutePath("中文.xml"); String path = FileUtil.getAbsolutePath("中文.xml");
Assertions.assertTrue(path.contains("中文.xml")); assertTrue(path.contains("中文.xml"));
path = FileUtil.getAbsolutePath("d:"); path = FileUtil.getAbsolutePath("d:");
Assertions.assertEquals("d:", path); Assertions.assertEquals("d:", path);
@ -108,7 +110,7 @@ public class FileUtilTest {
FileUtil.copy(srcFile, destFile, true); FileUtil.copy(srcFile, destFile, true);
Assertions.assertTrue(destFile.exists()); assertTrue(destFile.exists());
Assertions.assertEquals(srcFile.length(), destFile.length()); Assertions.assertEquals(srcFile.length(), destFile.length());
} }
@ -147,7 +149,7 @@ public class FileUtilTest {
final File destFile = FileUtil.file("d:/hutool.jpg"); final File destFile = FileUtil.file("d:/hutool.jpg");
final boolean equals = FileUtil.equals(srcFile, destFile); final boolean equals = FileUtil.equals(srcFile, destFile);
Assertions.assertTrue(equals); assertTrue(equals);
// 源文件存在目标文件不存在 // 源文件存在目标文件不存在
final File srcFile1 = FileUtil.file("hutool.jpg"); final File srcFile1 = FileUtil.file("hutool.jpg");
@ -224,13 +226,13 @@ public class FileUtilTest {
public void listFileNamesTest() { public void listFileNamesTest() {
// JDK9+由于模块化问题获取的classoath路径非项目下而是junit下的 // JDK9+由于模块化问题获取的classoath路径非项目下而是junit下的
List<String> names = FileUtil.listFileNames("classpath:"); List<String> names = FileUtil.listFileNames("classpath:");
Assertions.assertTrue(names.contains("hutool.jpg")); assertTrue(names.contains("hutool.jpg"));
names = FileUtil.listFileNames(""); names = FileUtil.listFileNames("");
Assertions.assertTrue(names.contains("hutool.jpg")); assertTrue(names.contains("hutool.jpg"));
names = FileUtil.listFileNames("."); names = FileUtil.listFileNames(".");
Assertions.assertTrue(names.contains("hutool.jpg")); assertTrue(names.contains("hutool.jpg"));
} }
@Test @Test
@ -401,7 +403,7 @@ public class FileUtilTest {
mimeType = FileUtil.getMimeType("test.js"); mimeType = FileUtil.getMimeType("test.js");
// jdk 11+ 会获取到 text/javascript,而非 自定义的 application/x-javascript // jdk 11+ 会获取到 text/javascript,而非 自定义的 application/x-javascript
final List<String> list = ListUtil.of("text/javascript", "application/x-javascript"); final List<String> list = ListUtil.of("text/javascript", "application/x-javascript");
Assertions.assertTrue(list.contains(mimeType)); assertTrue(list.contains(mimeType));
// office03 // office03
mimeType = FileUtil.getMimeType("test.doc"); mimeType = FileUtil.getMimeType("test.doc");
@ -439,7 +441,7 @@ public class FileUtilTest {
public void isSubRelativeTest() { public void isSubRelativeTest() {
final File file = new File(".."); final File file = new File("..");
final File file2 = new File("."); final File file2 = new File(".");
Assertions.assertTrue(FileUtil.isSub(file, file2)); assertTrue(FileUtil.isSub(file, file2));
} }
@Test @Test
@ -452,14 +454,14 @@ public class FileUtilTest {
@Test @Test
public void createTempFileTest() { public void createTempFileTest() {
final File nullDirTempFile = FileUtil.createTempFile(); final File nullDirTempFile = FileUtil.createTempFile();
Assertions.assertTrue(nullDirTempFile.exists()); assertTrue(nullDirTempFile.exists());
final File suffixDirTempFile = FileUtil.createTempFile(".xlsx", true); final File suffixDirTempFile = FileUtil.createTempFile(".xlsx", true);
Assertions.assertEquals("xlsx", FileNameUtil.getSuffix(suffixDirTempFile)); Assertions.assertEquals("xlsx", FileNameUtil.getSuffix(suffixDirTempFile));
final File prefixDirTempFile = FileUtil.createTempFile("prefix", ".xlsx", true); final File prefixDirTempFile = FileUtil.createTempFile("prefix", ".xlsx", true);
Console.log(prefixDirTempFile); Console.log(prefixDirTempFile);
Assertions.assertTrue(FileNameUtil.getPrefix(prefixDirTempFile).startsWith("prefix")); assertTrue(FileNameUtil.getPrefix(prefixDirTempFile).startsWith("prefix"));
} }
@Test @Test
@ -487,18 +489,27 @@ public class FileUtilTest {
public void issue3591Test() { public void issue3591Test() {
// 此文件最后一行末尾无换行符 // 此文件最后一行末尾无换行符
final int totalLines = FileUtil.getTotalLines(FileUtil.file("1_psi_index_0.txt")); final int totalLines = FileUtil.getTotalLines(FileUtil.file("1_psi_index_0.txt"));
Assertions.assertEquals(11, totalLines); assertEquals(11, totalLines);
} }
@Test @Test
public void isAbsolutePathTest() { public void isAbsolutePathTest() {
String path = "d:/test\\aaa.txt"; String path = "d:/test\\aaa.txt";
Assertions.assertTrue(FileUtil.isAbsolutePath(path)); assertTrue(FileUtil.isAbsolutePath(path));
path = "test\\aaa.txt"; path = "test\\aaa.txt";
Assertions.assertFalse(FileUtil.isAbsolutePath(path)); 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 @Test
@Disabled @Disabled
void readBytesTest() { void readBytesTest() {