日期:2014-05-20  浏览次数:20767 次

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是否合法。

------解决方案--------------------
当然会认为非法的 
你的数组里 有"/"字符不是么?
你的参数 也有这个"/"
if (filFilePath.indexOf(letters[i]) != -1) { 
isLegal = false; 
break; 


已经false break了
------解决方案--------------------
这个有难度啊
c:/1/2/33.2/4en.jpg
不晓得33.2/4en.jpg是一起的还是33.2目录下面的4en.jpg文件
------解决方案--------------------
应该把文件名和路径分开来判断是否合法
------解决方案--------------------
Java code
import java.util.regex.Matcher;
import java.util.regex.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 = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        System.out.println(matcher.matches());
    }
}

------解决方案--------------------
你追加一个判断啊,
Java code

if(path.indexOf("/")!=-1 && path.indexOf("\\")==-1){
  这样好像也是合法的,
}

------解决方案--------------------
有办法了,你把/转为\ 不就可以了,
------解决方案--------------------
没太看明白楼主的意思
filFilePath="c:\/1.jpg"这样加"\"不知道是否能解决楼主的问题
我记得":"好像不影响,楼主可以自己试一下
JAVA中如果需要把一些符号写进字符串还想保证符号有意义的话,可以再符号前面加"\"
也不知道说的对不对,请不清楚.希望对LZ有用

------解决方案--------------------
没想到具体的解决办法
只知道特殊的符合要转义


学习,关注
------解决方案--------------------
探讨
这个好像是正确答案,虽然我看过一些正则,但只是停留在很基础的地步,
[a-zA-Z]:这个我看懂了,剩下的乱七八糟的字符是什么意思啊?能否稍微
点拨一下呢

------解决方案--------------------
正则表达式http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#mission 如果打不开的话google一下就可以看到了
------解决方案--------------------
探讨
我自己亲自试了下

c:/1.jpg返回true
c:/1/.jpg返回true,应该返回false
c:\1.jpg返回false,应该返回true

能否再改进下?

------解决方案--------------------
正则表达式的资源:

http://topic.csdn.net/u/20080306/17/f37a1818-3968-49b4-8f79-e5564486d63e.html
------解决方案--------------------
我觉得可以先把 filepath 过滤一下,比如先把 C:\dsadas.jsp 过滤成 dsadas.jsp ,

把dsadas.jsp这个字符串重新赋给一个 string A,再if (A.indexOf(letters[i]) != -1) 判断就好了吧