Windows上的Java:防止文件名中的“/”斜杠作为分隔符

4

我需要根据提供给我的字符串创建一个文件。 以这个例子为例,假设文件名是"My file w/ stuff.txt"。 当Java使用

 File file = new File("My file w/ stuff.txt")

尽管默认的Windows分隔符是 '\',但它会将 '/' 斜杠视为文件分隔符。因此,对 file.getName() 的未来调用将返回 " stuff.txt"。这会影响我的程序。
有没有什么方法可以防止这种行为?

在文件名中,您可能不应该使用 /。您可以使用转义字符来避免这种情况,例如:File file = new File("My file w/ stuff.txt")。 - Falmarri
那行不通。它甚至无法编译,因为斜杠不需要转义。它可以直接表示。 - bradvido
2
Windows不允许您在重命名文件时输入正斜杠(至少通过Windows UI)。它是怎么出现的? - Jonathon Faust
你是对的。我刚确认了一下。看起来我只需要用空格替换斜杠,因为它们确实不是Windows文件名的有效字符。 - bradvido
在这个例子中,“My file w”将是目录,“stuff.txt”将是文件名,因此“My file w/ stuff.txt”将是一个有效的路径。 - Jeff Storey
nix系统中,文件名可以包含任何字符。我曾经记得有个同事无意中创建了一个名为的文件。有一天他问:“我该如何删除这个文件?”答案是:输入rm命令,后跟文件名。接下来的问题是:我的文件去哪了?嗯,也许你可以看看回收站,但是没有回收站。这对大家来说都很有趣,除了他自己! - David Heffernan
4个回答

7
根据这个维基百科页面,Windows APIs将/视为等同于\。 即使您在路径名组件(例如File对象)中嵌入了/,Windows也有可能在某些时候将其视为路径分隔符。

因此您的选择是:

  • 让Windows像通常一样处理/。 即让其将字符视为路径名分隔符。(用户应该知道这一点。这是对Windows用户的“计算机素养”要求。)

  • 与上面类似,但警告用户存在/

  • 检查/\字符,并拒绝两者,说明文件名(即路径名组件)不能包含路径名分隔符。

  • 使用某种编码方案在尝试创建文件之前编码保留的字符。 然后,在需要向用户显示其“带斜杠的文件名”的所有点上反向应用解码方案。

    注意:如果用户可以看到实际文件路径(例如通过命令 shell),则无法向他们隐藏编码/解码过程。可以说,这比您尝试解决的“问题”更糟糕。

    Windows操作系统不接受此目的的任何转义方案。 您需要使用诸如%编码之类的东西;例如用%2F替换/。 基本上,您需要通过在操作系统级路径名中使用其他字符替换它来“隐藏”斜杠字符以避免其影响 Windows!

最佳选项取决于您的应用程序的细节,例如您是否可以向输入虚假文件名的人报告问题。


0
如果一个字符串是从外部提供给你的,那么似乎你无法阻止该字符串包含某些字符。如果你有某种GUI来创建字符串,那么你总是可以在那里限制它。否则,创建文件的任何方法都应该检查斜杠并返回错误或根据需要处理它。

在我获取字符串之前,我无法控制它的内容。 同意,但我想处理它的方式是允许有效的斜杠保留在文件名中。 - bradvido
@bradvido 斜杠不是有效的字符,它是一个保留字符。 - David Heffernan

0

由于在Windows文件名中不允许使用正斜杠或反斜杠,因此应该将用于命名文件的字符串中的这些字符清除。


0

那么,你怎么能阻止它成为文件夹分隔符呢?它就是一个文件夹分隔符。如果你可以自己决定什么是,什么不是文件夹分隔符,那么整个系统就会崩溃。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接