যারা সাধারণ সমাধান খুঁজছেন তাদের ক্ষেত্রে এগুলি সাধারণ ক্রাইটার হতে পারে:
- ফাইলের নামটি স্ট্রিংয়ের অনুরূপ হওয়া উচিত।
- যেখানে সম্ভব সম্ভব এনকোডিংটি পুনরায় পরিবর্তনযোগ্য হওয়া উচিত।
- সংঘর্ষের সম্ভাবনা হ্রাস করা উচিত।
এটি অর্জনের জন্য আমরা অবৈধ অক্ষরগুলির সাথে মেলে রেজেক্স ব্যবহার করতে পারি, সেগুলি শতাংশ-এনকোড করতে পারি, তারপরে এনকোডযুক্ত স্ট্রিংয়ের দৈর্ঘ্য সীমাবদ্ধ করি।
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);
}
প্যাটার্নস
উপরের প্যাটার্নটি পসিক্স অনুচ্ছেদে অনুমোদিত অক্ষরের একটি রক্ষণশীল সাবসেটের উপর ভিত্তি করে ।
আপনি যদি বিন্দু চরিত্রটিকে অনুমতি দিতে চান তবে ব্যবহার করুন:
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_\\-]");
একটি শ্বেতলিস্ট ব্যবহার না করে, আপনি আপনার নির্দিষ্ট ফাইল সিস্টেমের জন্য সংরক্ষিত অক্ষরগুলি কালো তালিকাভুক্ত করতে পারেন। EG এই রেজেক্স 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");
সীমাবদ্ধতা
যেহেতু দীর্ঘতর স্ট্রিংগুলি কেটে গেছে, এনকোডিং করার সময় নামের সংঘর্ষ বা ডিকোডিংয়ের সময় দুর্নীতি হওয়ার সম্ভাবনা রয়েছে।