सामान्य समाधान की तलाश करने वालों के लिए, ये सामान्य संकट हो सकते हैं:
- फ़ाइल नाम स्ट्रिंग से मिलता जुलता होना चाहिए।
- एन्कोडिंग जहां संभव हो, प्रतिवर्ती होनी चाहिए।
- टकराव की संभावना कम से कम होनी चाहिए।
इसे प्राप्त करने के लिए हम regex का उपयोग अवैध पात्रों से मेल खाने के लिए कर सकते हैं, उन्हें प्रतिशत-एन्कोड कर सकते हैं, फिर एन्कोडेड स्ट्रिंग की लंबाई में बाधा डाल सकते हैं।
private static final Pattern PATTERN = Pattern.compile("[^A-Za-z0-9_\\-]");
private static final int MAX_LENGTH = 127;
public static String escapeStringAsFilename(String in){
StringBuffer sb = new StringBuffer();
// Apply the regex.
Matcher m = PATTERN.matcher(in);
while (m.find()) {
// Convert matched character to percent-encoded.
String replacement = "%"+Integer.toHexString(m.group().charAt(0)).toUpperCase();
m.appendReplacement(sb,replacement);
}
m.appendTail(sb);
String encoded = sb.toString();
// Truncate the string.
int end = Math.min(encoded.length(),MAX_LENGTH);
return encoded.substring(0,end);
}
पैटर्न्स
उपरोक्त पैटर्न POSIX कल्पना में अनुमत वर्णों के रूढ़िवादी सबसेट पर आधारित है ।
यदि आप डॉट वर्ण की अनुमति देना चाहते हैं, तो उपयोग करें:
private static final Pattern PATTERN = Pattern.compile("[^A-Za-z0-9_\\-\\.]");
बस तार से सावधान रहें "।" तथा ".."
यदि आप असंवेदनशील फाइल सिस्टम पर टकराव से बचना चाहते हैं, तो आपको राजधानियों से बचना होगा:
private static final Pattern PATTERN = Pattern.compile("[^a-z0-9_\\-]");
या निचले मामलों के पत्रों से बच जाएं:
private static final Pattern PATTERN = Pattern.compile("[^A-Z0-9_\\-]");
श्वेतसूची का उपयोग करने के बजाय, आप अपने विशिष्ट फाइल सिस्टम के लिए आरक्षित वर्णों को ब्लैकलिस्ट करने का विकल्प चुन सकते हैं। ईजी यह रेगेक्स FAT32 फाइल सिस्टम को सूट करता है:
private static final Pattern PATTERN = Pattern.compile("[%\\.\"\\*/:<>\\?\\\\\\|\\+,\\.;=\\[\\]]");
लंबाई
एंड्रॉइड पर, 127 वर्ण सुरक्षित सीमा है। कई फाइल सिस्टम 255 वर्णों की अनुमति देते हैं।
यदि आप अपने स्ट्रिंग के सिर के बजाय पूंछ को बनाए रखना पसंद करते हैं, तो उपयोग करें:
// Truncate the string.
int start = Math.max(0,encoded.length()-MAX_LENGTH);
return encoded.substring(start,encoded.length());
डिकोडिंग
फ़ाइल नाम को मूल स्ट्रिंग में बदलने के लिए, उपयोग करें:
URLDecoder.decode(filename, "UTF-8");
सीमाएं
क्योंकि लंबे समय तक तार काटे जाते हैं, एन्कोडिंग या डिकोडिंग के दौरान भ्रष्टाचार होने पर नाम टकराने की संभावना होती है।