有没有一个跨平台的Java方法来删除文件名特殊字符? [英] Is there a cross-platform Java method to remove filename special chars?

查看:410
本文介绍了有没有一个跨平台的Java方法来删除文件名特殊字符?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作一个跨平台的应用程序,根据在线检索的数据重命名文件。我想清理从当前平台的Web API中获取的字符串。



我知道不同的平台有不同的文件名要求,所以我想知道如果有跨平台的方式来做到这一点?



编辑:在Windows平台上,文件中不能有问号?名字,而在Linux中,你可以。文件名可能包含这样的字符,我希望支持这些字符的平台保留它们,否则,将它们去掉。

另外,我更喜欢标准的Java解决方案,不需要第三方库。

解决方案

正如其他地方所建议的,这通常不是你想要的做。通常最好使用File.createTempFile()这样的安全方法创建一个临时文件。



你不应该用白名单来做这件事,只保留好字符。如果这个文件只有中文字符,那么你会把所有的东西都删掉。由于这个原因,我们不能使用白名单,我们必须使用黑名单。



Linux几乎可以让任何事情变成真正的痛苦。我只是将Linux限制在与限制Windows相同的列表中,这样您就可以在将来避免麻烦。



在Windows上使用此C#代码段时,我生成了一个字符列表在Windows上无效。 (41)所以我不建议尝试创建自己的列表。

  {
Console.Write((int)c);
Console.Write(,);



$ b $ p
$ b

这是一个简单的Java类,它清理文件名。 p>

  public class FileNameCleaner {
final static int [] illegalChars = {34,60,62,124,0, 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21, 27,28,29,30,31,58,42,63,92,47};
static {
Arrays.sort(illegalChars);

public static String cleanFileName(String badFileName){
StringBuilder cleanName = new StringBuilder();
for(int i = 0; i< badFileName.length(); i ++){
int c =(int)badFileName.charAt(i);
if(Arrays.binarySearch(illegalChars,c)< 0){
cleanName.append((char)c);
}

return cleanName.toString();






编辑:
正如斯蒂芬建议你可能也应该验证这些文件访问只发生在你允许的目录中。

下面的答案具有示例代码,用于在Java中建立自定义安全上下文,然后执行代码'sandbox'。

你如何创建一个安全的JEXL(脚本)沙盒?


I'm making a cross-platform application that renames files based on data retrieved online. I'd like to sanitize the Strings I took from a web API for the current platform.

I know that different platforms have different file-name requirements, so I was wondering if there's a cross-platform way to do this?

Edit: On Windows platforms you cannot have a question mark '?' in a file name, whereas in Linux, you can. The file names may contain such characters and I would like for the platforms that support those characters to keep them, but otherwise, strip them out.

Also, I would prefer a standard Java solution that doesn't require third-party libraries.

解决方案

As suggested elsewhere, this is not usually what you want to do. It is usually best to create a temporary file using a secure method such as File.createTempFile().

You should not do this with a whitelist and only keep 'good' characters. If the file is made up of only Chinese characters then you will strip everything out of it. We can't use a whitelist for this reason, we have to use a blacklist.

Linux pretty much allows anything which can be a real pain. I would just limit Linux to the same list that you limit Windows to so you save yourself headaches in the future.

Using this C# snippet on Windows I produced a list of characters that are not valid on Windows. There are quite a few more characters in this list than you may think (41) so I wouldn't recommend trying to create your own list.

        foreach (char c in new string(Path.GetInvalidFileNameChars()))
        {
            Console.Write((int)c);
            Console.Write(",");
        }

Here is a simple Java class which 'cleans' a file name.

public class FileNameCleaner {
final static int[] illegalChars = {34, 60, 62, 124, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 58, 42, 63, 92, 47};
static {
    Arrays.sort(illegalChars);
}
public static String cleanFileName(String badFileName) {
    StringBuilder cleanName = new StringBuilder();
    for (int i = 0; i < badFileName.length(); i++) {
        int c = (int)badFileName.charAt(i);
        if (Arrays.binarySearch(illegalChars, c) < 0) {
            cleanName.append((char)c);
        }
    }
    return cleanName.toString();
}
}

EDIT: As Stephen suggested you probably also should verify that these file accesses only occur within the directory you allow.

The following answer has sample code for establishing a custom security context in Java and then executing code in that 'sandbox'.

How do you create a secure JEXL (scripting) sandbox?

这篇关于有没有一个跨平台的Java方法来删除文件名特殊字符?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆