我从用户收到一个字符串,该字符串应该用作将内容保存到文件的位置。此字符串应包含足够的信息,如目录+文件名。
我的问题是,如何检查提供的字符串是否是将内容保存到文件的有效路径(至少在理论上)?
是否创建目录无关紧要,或者是否具有对该位置本身的适当访问权限。我只对检查提供的字符串的结构感兴趣。
我该怎么办?我在考虑创建一个File
对象,然后提取它的URI
。还有更好的办法吗?
答案 0 :(得分:10)
您可以使用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
}
}
答案 1 :(得分:2)
你看过Apache Commons IO了吗?该库包括用于处理路径信息的各种事物,这些信息可能有助FilenameUtils.getPath(String filename)
从完整文件名返回路径。
答案 2 :(得分:1)
最简单:尝试保存,听取异常。
我唯一一次做更复杂的事情就是如果要延迟写作,并且你想给用户提供他的反馈现在。
答案 3 :(得分:0)
这是我到目前为止所做的:
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的输入结合起来。