java中如何判断⼀个String类型的filFilePath是否是⼀个合法的
⽂件路径
现在碰到⼀个难题,我的代码并不能符合我⾃⼰的要求,如下:
boolean isLegal = true;
String[] letters = new String[] { "/", "\\", ":", "*", "?", "\"", "<",
">", "|" };
for (int i = 0; i < letters.length; i++) {
if (filFilePath.indexOf(letters[i]) != -1) {
isLegal = false;
break;
}
}
if (!isLegal) {
//msg.setCode("AP_GBC007_3");
//container.setJspErrMsg(msg);
return false;
}
我解释⼀下,letters数组中定义的字符都是windows⾥不允许在⽂件名中出现的,
可是如果filFilePath="c:/1.jpg"原则上是合法的,但我的⽅法却把它认作⾮法的,请问,如何改进我的⽅法呢?
注意:千万不能⽤java.io.File类的isFile⽅法,这个⽅法只能判断服务器上是否有这个⽂件,并且⽂件名是否合法
⽽不能判断客户端浏览器那传过来的filFilePath是否合法。
16 个解决⽅案
#1
当然会认为⾮法的
你的数组⾥ 有"/"字符不是么?
你的参数 也有这个"/"
if (filFilePath.indexOf(letters[i]) != -1) {
isLegal = false;
break;
}
已经false break了
#2
这个有难度啊
c:/1/2/33.2/4en.jpg
不晓得33.2/4en.jpg是⼀起的还是33.2⽬录下⾯的4en.jpg⽂件
#3
应该把⽂件名和路径分开来判断是否合法
#4
import Matcher;
import Pattern;
public class Test01 {
public static void main(String[] args) {
String str = "c:/program file/a\\1.jpg";java中index是什么意思
String regex = "[a-zA-Z]:(?:[/\\\\][^/\\\\:*?\"<>|]{1,255})+";
Pattern pattern = Patternpile(regex);
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.matches());
}
}
#5
你追加⼀个判断啊,
if(path.indexOf("/")!=-1 && path.indexOf("\\")==-1){
这样好像也是合法的,
}
#6
有办法了,你把/转为\ 不就可以了,
#7
没太看明⽩楼主的意思
filFilePath="c:\/1.jpg"这样加"\"不知道是否能解决楼主的问题
我记得":"好像不影响,楼主可以⾃⼰试⼀下
JAVA中如果需要把⼀些符号写进字符串还想保证符号有意义的话,可以再符号前⾯加"\" 也不知道说的对不对,请不清楚.希望对LZ有⽤
#8
没想到具体的解决办法
只知道特殊的符合要转义
学习,关注
#9
这个好像是正确答案,虽然我看过⼀些正则,但只是停留在很基础的地步,
[a-zA-Z]:这个我看懂了,剩下的乱七⼋糟的字符是什么意思啊?能否稍微
点拨⼀下呢
#10
引⽤ 9 楼 zhouzhijun 的回复:
这个好像是正确答案,虽然我看过⼀些正则,但只是停留在很基础的地步, [a-zA-Z]:这个我看懂了,剩下的乱七⼋糟的字符是什么意思啊?能否稍微 点拨⼀下呢
我是记不住的,估计不常⽤的⼈都记不住,去翻API哈
#11
引⽤ 4 楼 bao110908 的回复:
Java codeimport Matcher;
import Pattern;
public class Test01 {
public static void main(String[] args) {
String str = "c:/program file/a\\1.jpg";
String regex = "[a-zA-Z]:(?:[/\\\\][^/\\\\:*?\"<>|]{1,255})+";
Pattern pattern = Patternpile(regex);
Matcher matcher = pattern.matcher(str);
System.out.println(mat…
这个好像是正确答案,虽然我看过⼀些正则,但只是停留在很基础的地步,
[a-zA-Z]:这个我看懂了,剩下的乱七⼋糟的字符是什么意思啊?能否稍微
点拨⼀下呢
#12
引⽤ 4 楼 bao110908 的回复:
Java codeimport Matcher;
import Pattern;
public class Test01 {
public static void main(String[] args) {
String str = "c:/program file/a\\1.jpg";
String regex = "[a-zA-Z]:(?:[/\\\\][^/\\\\:*?\"<>|]{1,255})+";
Pattern pattern = Patternpile(regex);
Matcher matcher = pattern.matcher(str);
System.out.println(mat…
我⾃⼰亲⾃试了下
c:/1.jpg返回true
c:/1/.jpg返回true,应该返回false
c:\1.jpg返回false,应该返回true
能否再改进下?
#13
如果打不开的话google⼀下就可以看到了
#14
引⽤ 12 楼 zhouzhijun 的回复:
我⾃⼰亲⾃试了下
c:/1.jpg返回true
c:/1/.jpg返回true,应该返回false
c:\1.jpg返回false,应该返回true
能否再改进下?
c:/1/.jpg .jpg 是合法的⽂件名
c:\1.jpg 你在 JAVA 字符串中应该写为 "c:\\1.jpg" 如果要让 .jpg 成为⾮法的⽂件名,改成这样就可以了。
import Matcher;
import Pattern;
public class Test01 {
public static void main(String[] args) {
String[] strs = {
"c:\\.jpg",
"c:/.jpg",
"c:/1/1.jpg",
"c:\\1.jpg"
};
String regex = "[a-zA-Z]:(?:[/\\\\][^/\\\\:*?\"<>|.][^/\\\\:*?\"<>|]{0,254})+";
Pattern pattern = Patternpile(regex);
Matcher matcher = pattern.matcher("");
for(int i = 0; i < strs.length; i++) {
System.out.println(strs[i] + " " + set(strs[i]).matches());
}
}
}
#15
正则表达式的资源:
#16
我觉得可以先把 filepath 过滤⼀下,⽐如先把 C:\dsadas.jsp 过滤成 dsadas.jsp ,
把dsadas.jsp这个字符串重新赋给⼀个 string A,再if (A.indexOf(letters[i]) != -1) 判断就好了吧
过滤很简单的,⽤ stringbuffer 的StringTokenizer就可以了
转载请注明本⽂地址:
看完本⽂还有福利^-^:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论