2010-03-23 59 views
5

对于文件和目录名,有一些受限制的字符(甚至在Windows中是全文件名)。这other question已经涵盖了他们。如何在Java中检索文件名的禁用字符?

在Java中,有没有一种方法可以检索禁用字符列表,这取决于系统(有点像检索断路器字符)?或者我只能自己放列表,检查系统?


编辑:从一般的问题,在我的特殊情况更多的背景,一边。

我使用默认名称,来自某些数据(对其内容没有真正的控制权),并将此名称作为默认文件名(使用setSelectedFile())提供给JFileChooser。但是,这个截断了最后一个无效字符之前的任何内容。

这些默认名称有时会以“mm/dd/yy”格式结束日期,仅保留默认名称中的“yy”,因为“/”被禁止。因此,检查异常并不是真正的选择,因为文件本身甚至还没有创建。

编辑之二:嗯,这让我想,如果JFileChooser截断了这个名字,它可能有权访问这些字符的列表,可以进一步检查。

编辑ter:好吧,检查来自JFileChooser的源代码显示了一些非常简单的东西。对于文本字段,它使用file.getName()。它实际上并不检查无效字符,它只是将“/”作为路径分隔符,并仅保留最终的“实际文件名”。其他禁止的字符实际上通过。

回答

4

当谈到与“禁”字打交道我宁愿缩手缩脚和禁令/更换可以在任何文件系统出现问题了所有的“特”字。

即使技术上允许,有时候这些角色也会引起怪异。

例如,我们遇到了一个问题,即PDF文件正在写入(成功)到SAN,但是当通过Web服务器从该位置提供时,一些字符会在我们嵌入PDF时导致问题一个在Firefox中呈现的HTML页面。如果直接访问PDF并且在其他浏览器中正常,那就好了。 Firefox和Adobe Reader交互方式出现一些奇怪的错误。

摘要:在文件名“特”字 - >奇怪的错误等待发生

最后,可以肯定的唯一方式是使用白名单。

+0

定义“特殊字符”。 – 2010-03-23 10:13:53

+0

+1白名单 – 2010-03-23 10:34:54

+2

+1在大多数UNIX-y文件系统中,唯一被禁止的字符是'/'和nul-字符'\ 0'。 – 2010-03-23 11:10:45

-2

看看这个链接了解如何获取应用程序运行的操作系统。基本上你需要使用System.getProperty(“os.name”)并执行equals()或contains()来查找操作系统。

虽然知道操作系统并不一定会告诉您正在使用的底层文件系统,例如Mac可以读取和写入FAT32文件系统。

来源:http://www.mkyong.com/java/how-to-detect-os-in-java-systemgetpropertyosname/

2

拥有某些“禁止使用的字符”只是创建文件时可能会出错的其中一种(其他的是访问权限和文件和路径名称长度)。

当您尝试创建文件时,如果有其他人无法捕捉,尝试捕获其中的一些内容并没有什么意义。正确处理例外。

+0

事实上,这个名称是从某些数据中检索的默认名称,因此它可能包含不适合文件名的字符。这个默认的JFileChooser被赋予了一个JFileChooser,而这个JFileChooser在截断了一个被禁止的字符前截断了所有的东西。所以在这种情况下,我需要先替换这些字符,这样默认的字符才有意义。在这种情况下,没有异常抛出,因为该文件尚未创建。 – Gnoupi 2010-03-23 10:37:45

+1

难道你不能做一个安全的默认? (比如只使用ascii-7?)。另一方面,您可以:1)将候选默认值传递给JFileChooser 2)请求截断字符串(不显示对话框)3)如果返回的文件名较短,则知道禁用的字符的位置。 – helios 2010-03-23 10:42:25

+0

我的部分与JFileChooser实际上是一个问题,只有当使用路径分隔符时,现在在我的问题中描述。对于其他被禁止的字符,JfileChooser实际上并不过滤任何东西,它只是返回输入的文件名。那么你的解决方案可能是最简单的,只是在试图真正写入文件和处理异常时进行检查。 – Gnoupi 2010-03-23 11:08:35

2

您是否尝试过使用File.getCanonicalPath并将其与原来的文件名(或任何由getAbsolutePath检索)?

这不会给你实际的字符,但它可以帮助你确定这是否是你正在运行的操作系统中的有效文件名。

相关问题