【问题标题】:Why does this java function not indicate that filepath is invalid为什么这个java函数不表示文件路径无效
【发布时间】:2013-11-17 21:00:50
【问题描述】:

我正在尝试检查用户输入的文件路径对操作系统是否有效,我认为这可以通过 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..

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

【问题讨论】:

  • 你应该尝试这个使操作系统中立并根据操作系统选择分隔符。
  • 代码是操作系统中立的,这些只是在 Windows 上使用时的测试用例
  • 不明白为什么有人试图关闭这个问题,当然是关于编程

标签: java windows nio java-io


【解决方案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)

【讨论】:

  • @rolfi 但如果我尝试在 Windows 资源管理器中创建这样的文件,它会删除句点?
  • 这是 Windows 资源管理器中的一个错误......它认为它比你更聪明,它正在寻找文件的扩展名,所以它不希望你这样做。
  • 对不起,一个例子中的 / 和另一个例子中的 // 是一个错误类型,增加了混淆,它应该只是 C:\ 在两个例子中
  • 嗯,我正在仔细检查 Windows 中的尾随点...奇怪。我无法写入文件并在其后保留点....
  • 我进入 DOS 很奇怪,如果我尝试创建 C:\Fred: 它会给出错误,如果我尝试创建 C:\Fred.. 它不会抱怨但实际上会创建 C: \Fred,然后如果我尝试创建 C:\Fred... 它会抱怨文件已经存在
【解决方案2】:

您的结果似乎还可以。

c://File.. 是 Windows 中的有效文件名,虽然我找不到任何有关它的文档,但两个 .. 似乎以特殊方式处理 - 它只是从名称中删除,所以 @987654324 @ 与 file 甚至 file..... 相同。这可能是与 windows 如何处理文件扩展名的一些交互。

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

【讨论】:

    猜你喜欢
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2016-09-23
    相关资源
    最近更新 更多