修复FileUtil.file末尾换行符导致路径判断错误的问题

This commit is contained in:
Looly 2024-07-10 20:23:44 +08:00
parent 0698f7a5ff
commit e09ca3c40b
3 changed files with 49 additions and 13 deletions

View File

@ -15,9 +15,10 @@ package org.dromara.hutool.core.io.file;
import org.dromara.hutool.core.collection.CollUtil;
import org.dromara.hutool.core.net.url.UrlUtil;
import org.dromara.hutool.core.regex.ReUtil;
import org.dromara.hutool.core.text.CharUtil;
import org.dromara.hutool.core.text.StrTrimer;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.text.split.SplitUtil;
import org.dromara.hutool.core.text.CharUtil;
import org.dromara.hutool.core.util.SystemUtil;
import java.io.File;
@ -36,20 +37,20 @@ public class FileNameUtil {
/**
* .java文件扩展名
*/
public static final String EXT_JAVA = ".java";
public static final String EXT_JAVA = ".java" ;
/**
* .class文件扩展名
*/
public static final String EXT_CLASS = ".class";
public static final String EXT_CLASS = ".class" ;
/**
* .jar文件扩展名
*/
public static final String EXT_JAR = ".jar";
public static final String EXT_JAR = ".jar" ;
/**
* 在Jar中的路径jar的扩展名形式
*/
public static final String EXT_JAR_PATH = ".jar!";
public static final String EXT_JAR_PATH = ".jar!" ;
/**
* 类Unix路径分隔符
@ -150,12 +151,12 @@ public class FileNameUtil {
* 增加临时扩展名
*
* @param fileName 文件名
* @param suffix 临时扩展名如果为空使用`.temp`
* @param suffix 临时扩展名如果为空使用`.temp`
* @return 临时文件名
*/
public static String addTempSuffix(final String fileName, String suffix){
public static String addTempSuffix(final String fileName, String suffix) {
if (StrUtil.isBlank(suffix)) {
suffix = ".temp";
suffix = ".temp" ;
} else {
suffix = StrUtil.addPrefixIfNot(suffix, StrUtil.DOT);
}
@ -217,7 +218,7 @@ public class FileNameUtil {
//issue#2642多级扩展名的主文件名
for (final CharSequence specialSuffix : SPECIAL_SUFFIX) {
if(StrUtil.endWith(fileName, "." + specialSuffix)){
if (StrUtil.endWith(fileName, "." + specialSuffix)) {
return StrUtil.subPre(fileName, len - specialSuffix.length() - 1);
}
}
@ -380,6 +381,8 @@ public class FileNameUtil {
pathToUse = pathToUse.replaceAll("[/\\\\]+", StrUtil.SLASH);
// 去除开头空白符末尾空白符合法不去除
pathToUse = StrUtil.trimPrefix(pathToUse);
// issue#IAB65V 去除尾部的换行符
pathToUse = StrUtil.trim(pathToUse, StrTrimer.TrimMode.SUFFIX, (c)->c == '\n' || c == '\r');
String prefix = StrUtil.EMPTY;
final int prefixIndex = pathToUse.indexOf(StrUtil.COLON);
@ -402,8 +405,19 @@ public class FileNameUtil {
pathToUse = pathToUse.substring(1);
}
final List<String> pathList = SplitUtil.split(pathToUse, StrUtil.SLASH);
final List<String> pathElements = resolePathElements(SplitUtil.split(pathToUse, StrUtil.SLASH), prefix);
return prefix + CollUtil.join(pathElements, StrUtil.SLASH);
}
/**
* 处理路径将路径中的"."".."转换为标准的路径元素
*
* @param pathList 路径列表使用`/`隔开的路径元素列表
* @param prefix 路径前缀用于区别相对或绝对路径
* @return 处理后的路径
*/
private static List<String> resolePathElements(final List<String> pathList, final String prefix) {
final List<String> pathElements = new LinkedList<>();
int tops = 0;
String element;
@ -434,8 +448,7 @@ public class FileNameUtil {
pathElements.add(0, StrUtil.DOUBLE_DOT);
}
}
return prefix + CollUtil.join(pathElements, StrUtil.SLASH);
return pathElements;
}
// -------------------------------------------------------------------------------------------- name end
}

View File

@ -70,7 +70,7 @@ public class FileUtil extends PathUtil {
/**
* 绝对路径判断正则
*/
private static final Pattern PATTERN_PATH_ABSOLUTE = Pattern.compile("^[a-zA-Z]:([/\\\\].*)?");
private static final Pattern PATTERN_PATH_ABSOLUTE = Pattern.compile("^[a-zA-Z]:([/\\\\].*)?", Pattern.DOTALL);
/**

View File

@ -0,0 +1,23 @@
package org.dromara.hutool.core.io.file;
import org.junit.jupiter.api.Test;
import java.io.File;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
* https://gitee.com/dromara/hutool/issues/IAB65V
*/
public class IssueIAB65VTest {
@Test
public void getAbsolutePathTest() {
final String path = "D:\\test\\personal\n";
final File file = FileUtil.file(path);
if(FileUtil.isWindows()){
// 换行符自动去除
assertEquals("D:\\test\\personal", file.toString());
}
}
}