0

我正在尝试检查用户输入的文件路径对操作系统是否有效,我认为这可以通过 Paths.get(filePath) 来实现,所以我编写了这个简单的函数

 public static boolean isValidFilename(String s)
    {
        try
        {
            Paths.get(s);
            return true;
        }
        catch (InvalidPathException e)
        {
            return false;
        }
    }

但是在 Windows 8 上它会成功返回 false

c:\File:: 

它不会为

c:\File..

这是一个错误,还是我的误解

4

2 回答 2

1

这是你的误解。在 Windows 中,冒号不是合法的文件名字符,而是句点 '.' 是。

第二个文件是有效的......它与C:/File... (即C://File..C:/File..是相同的位置)

编辑:在这里看到这个问题:How to create a filename with a trailing period in Windows?

我已经在我的系统中尝试过,不幸的是我的结果好坏参半....上面的答案仍然很好读....

Edit2:我已经运行了以下代码,现在它适用于我:

        File file = new File("\\\\?\\C:/Temp/File..");
        FileOutputStream fos = new FileOutputStream(file);
        fos.write("Foo".getBytes());
        fos.close();

似乎该\\?\构造适用于java.io.File,但不适用于java.nio.file.Path

如果您打印出异常,您也会对问题所在有更多的了解......

java.nio.file.InvalidPathException: Illegal char <:> at index 7: C:/File::
at sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:194)
at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:165)
at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:89)
at sun.nio.fs.WindowsPath.parse(WindowsPath.java:106)
at sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:267)
at java.nio.file.Paths.get(Paths.java:95)
于 2013-11-06T14:55:50.963 回答
0

你的结果似乎还可以。

c://File..在 windows 中是一个有效的文件名,虽然我找不到任何关于它的文档,但这两者..似乎是以一种特殊的方式处理的——它只是从名称中剥离出来,所以与 .或什file..至相同。这可能是与 Windows 如何处理文件扩展名的一些交互。filefile.....

c:/File::不是,因为您不能:在文件名中有 a(参见例如http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx

于 2013-11-06T14:56:01.740 回答