代码之家  ›  专栏  ›  技术社区  ›  alex2k8

Android上的文件名允许哪些字符?

  •  45
  • alex2k8  · 技术社区  · 16 年前

    Android上的文件名允许使用哪些特殊字符?

    ~!@#$%^&*()_+/\.,
    

    6 回复  |  直到 7 年前
        1
  •  38
  •   alex2k8    15 年前
    1. 看起来保留的文件名字符取决于安装的文件系统( http://en.wikipedia.org/wiki/Filename ).

    private static final String ReservedChars = "|\\?*<\":>+[]/'";
    
        2
  •  10
  •   k4dima    13 年前

    根据 wiki

    目录项中允许的字符

    除值0-31、127(DEL)和:“*/:<>?\ |+,.;=[](小写a-z存储为a-z)。对于VFAT LFN,除NUL以外的任何Unicode

        3
  •  7
  •   Mat    14 年前
    final String[] ReservedChars = {"|", "\\", "?", "*", "<", "\"", ":", ">"};
    
    for(String c :ReservedChars){
        System.out.println(dd.indexOf(c));
        dd.indexOf(c);
    }
    
        4
  •  5
  •   Quark    11 年前

    这是正确的 输入滤波器 对于Android中的文件名:

        InputFilter filter = new InputFilter()
        {
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) 
            { 
                if (source.length() < 1) return null;
                char last = source.charAt(source.length() - 1);
                String reservedChars = "?:\"*|/\\<>";
                if(reservedChars.indexOf(last) > -1) return source.subSequence(0, source.length() - 1);
                return null;
            }  
        };
    
        5
  •  5
  •   minsk    5 年前

    android.os.FileUtils

        private static boolean isValidFatFilenameChar(char c) {
            if ((0x00 <= c && c <= 0x1f)) {
                return false;
            }
            switch (c) {
                case '"':
                case '*':
                case '/':
                case ':':
                case '<':
                case '>':
                case '?':
                case '\\':
                case '|':
                case 0x7F:
                    return false;
                default:
                    return true;
            }
        }
    
        private static boolean isValidExtFilenameChar(char c) {
            switch (c) {
                case '\0':
                case '/':
                    return false;
                default:
                    return true;
            }
        }
    

        6
  •  2
  •   TopherC    9 年前

    Galaxy Note 8 在Android 4.4.2上。默认的“我的文件”应用程序有助于灰显无效字符,如下所示:

    我将所有其他可用的特殊字符放入一个文件名中并保存了它。这在所有Android版本中可能并不一致,所以最好保守一点,用同样有意义的字符替换它们。

        7
  •  1
  •   marzetti    8 年前

    这显然依赖于文件系统和Android操作系统。在我的oneplus/oxygenOS上,唯一被接受的答案是

    private static final String ReservedChars = "|\\?*<\":>+[]/'";
    

    无法用于重命名文件的是/和*

        8
  •  1
  •   Slion    5 年前

    在Android上 as suggested there 您可以使用输入筛选器来防止用户输入无效字符,下面是一个更好的实现:

    /**
     * An input filter which can be attached to an EditText widget to filter out invalid filename characters
     */
    class FileNameInputFilter: InputFilter
    {
    override fun filter(source: CharSequence?, start: Int, end: Int, dest: Spanned?, dstart: Int, dend: Int): CharSequence? {
        if (source.isNullOrBlank()) {
            return null
        }
    
        val reservedChars = "?:\"*|/\\<>\u0000"
        // Extract actual source
        val actualSource = source.subSequence(start, end)
        // Filter out unsupported characters
        val filtered = actualSource.filter { c -> reservedChars.indexOf(c) == -1 }
        // Check if something was filtered out
        return if (actualSource.length != filtered.length) {
            // Something was caught by our filter, provide visual feedback
                if (actualSource.length - filtered.length == 1) {
                    // A single character was removed
                    BrowserApp.instance.applicationContext.toast(R.string.invalid_character_removed)
                } else {
                    // Multiple characters were removed                    
         BrowserApp.instance.applicationContext.toast(R.string.invalid_characters_removed)
                    }
                // Provide filtered results then
                filtered
            } else {
                // Nothing was caught in our filter
                null
            }
        }
    }