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 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());
    }
}

#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 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(mat…

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

#12


引用 4 楼 bao110908 的回复:
Java codeimport 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(mat…

我自己亲自试了下

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

能否再改进下?

#13


正则表达式http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#mission 如果打不开的话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 java.util.regex.Matcher;
import java.util.regex.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 = Pattern.compile(regex);
        Matcher matcher = pattern.matcher("");
        for(int i = 0; i < strs.length; i++) {
            System.out.println(strs[i] + "  " + matcher.reset(strs[i]).matches());
        }
    }
}

#15


正则表达式的资源:

http://topic.csdn.net/u/20080306/17/f37a1818-3968-49b4-8f79-e5564486d63e.html

#16


我觉得可以先把 filepath 过滤一下,比如先把 C:\dsadas.jsp 过滤成 dsadas.jsp ,

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


过滤很简单的,用  stringbuffer 的StringTokenizer就可以了 
转载请注明本文地址: java中如何判断一个String类型的filFilePath是否是一个合法的文件路径

看完本文还有福利^-^:
20180512144120365
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值