【问题标题】:How to check whether a (String) location is a valid saving path in Java?如何检查(字符串)位置是否是Java中的有效保存路径?
【发布时间】:2011-09-23 21:13:34
【问题描述】:

我从用户那里收到一个字符串,它应该用作将内容保存到文件的位置。这个字符串应该包含足够的信息,比如目录+文件名。

我的问题是,如何检查提供的字符串是否是将内容保存到文件的有效路径(至少在理论上)?

目录是否被创建,或者是否有权访问该位置本身都无关紧要。我只对检查提供的字符串的结构感兴趣。

我应该如何进行?我正在考虑创建一个File 对象,然后提取它的URI。有没有更好的办法?

【问题讨论】:

  • 虽然不是完全相同的问题,但您可能会从 this question 获得一些见解。

标签: java validation file location


【解决方案1】:

您可以使用 File.getCanonicalPath() 根据当前的操作系统规则进行验证。

import java.io.File;
import java.io.IOException;

public class FileUtils {
  public static boolean isFilenameValid(String file) {
    File f = new File(file);
    try {
       f.getCanonicalPath();
       return true;
    }
    catch (IOException e) {
       return false;
    }
  }

  public static void main(String args[]) throws Exception {
    // true
    System.out.println(FileUtils.isFilenameValid("well.txt"));
    System.out.println(FileUtils.isFilenameValid("well well.txt"));
    System.out.println(FileUtils.isFilenameValid(""));

    //false
    System.out.println(FileUtils.isFilenameValid("test.T*T"));
    System.out.println(FileUtils.isFilenameValid("test|.TXT"));
    System.out.println(FileUtils.isFilenameValid("te?st.TXT"));
    System.out.println(FileUtils.isFilenameValid("con.TXT")); // windows
    System.out.println(FileUtils.isFilenameValid("prn.TXT")); // windows
    }
  }

【讨论】:

  • 我知道这是旧的但是。不适用于“a>a”之类的路径。 getCanonicalPath 不会引发任何异常,但系统不允许使用“>”字符(以及其他字符)。
  • 这里也一样,如果我输入“someZip.zip //aabbcc/”,那么它将通过验证,但在传递给 .resolve() 时会失败
【解决方案2】:

你看过Apache Commons IO吗?这个库包括处理路径信息的各种东西,这可能会有所帮助,例如FilenameUtils.getPath(String filename) 返回完整文件名的路径。

【讨论】:

    【解决方案3】:

    最简单:尝试保存,监听异常。

    唯一一次我会做一些更复杂的事情是如果写作被推迟,你想给用户他的反馈现在

    【讨论】:

    • 如果我这样做了,我仍然不确定问题是什么。这就是我需要找出的。
    【解决方案4】:

    这是我目前所拥有的:

    private static boolean checkLocation(String toCheck) {
    
        // If null, we necessarily miss the directory section
        if ( toCheck == null ) {
            System.out.println("Missing directory section");
            return false;
        }
    
        String retrName = new File(toCheck).toURI().toString();
    
        // Are we dealing with a directory?
        if ( retrName.charAt(retrName.length()-1) == '/') {
            System.out.println("Missing file name");
            return false;
        }
    
        return true;
    
    }
    

    这告诉我我是否有正确的目录结构以及我是否指向目录而不是文件。我不需要 I/O 访问。

    我注意到,如果我在显式指向目录(尚不存在)的位置上使用 File.createNewFile() 方法,Java 会创建一个没有扩展名的文件,这是完全错误的。它要么应该创建一个目录,要么应该抛出某种错误。

    此外,如果参数中没有提供当前目录,则 File 构造函数倾向于添加当前目录。它没有记录在案,但对我来说没有真正的伤害。

    如果有人有更好的解决方案,我会批准。

    编辑

    我终于将以上内容与 RealHowTo 的输入结合起来了。

    【讨论】:

    • 为了让遇到这个问题的人(比如我)更清楚:File.createNewFile() 创建一个没有扩展名的新文件,因为从一个文件到一个目录的文件路径没有区别(在至少在 UNIX 和 Windows File.mkdir()
    猜你喜欢
    • 2014-12-05
    • 2022-12-15
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 2014-09-04
    • 2011-03-09
    相关资源
    最近更新 更多