আমি সম্প্রতি বিভিন্ন লোকেশন থেকে এমপি 3 গুলির একটি গুচ্ছকে একটি ভান্ডারে পরিণত করছি। আমি আইডি 3 ট্যাগ ব্যবহার করে নতুন ফাইলের নামগুলি তৈরি করছিলাম (ধন্যবাদ, ট্যাগলিব-শার্প!) এবং আমি লক্ষ্য করেছি যে আমি একটি পেয়ে যাচ্ছি System.NotSupportedException
:
"প্রদত্ত পথের বিন্যাসটি সমর্থিত নয়।"
এটি হয় File.Copy()
বা দ্বারা উত্পাদিত হয়েছিল Directory.CreateDirectory()
।
আমার ফাইলের নাম স্যানিটাইজ করা দরকার তা বুঝতে সময় লাগেনি। সুতরাং আমি স্পষ্টতই কাজটি করেছি:
public static string SanitizePath_(string path, char replaceChar)
{
string dir = Path.GetDirectoryName(path);
foreach (char c in Path.GetInvalidPathChars())
dir = dir.Replace(c, replaceChar);
string name = Path.GetFileName(path);
foreach (char c in Path.GetInvalidFileNameChars())
name = name.Replace(c, replaceChar);
return dir + name;
}
আমার অবাক করে দিয়েছি, আমি ব্যতিক্রম পেতে থাকি। দেখা গেছে যে ':' এর সেটে নেই Path.GetInvalidPathChars()
, কারণ এটি কোনও মূলের রুটে বৈধ। আমি মনে করি এটি উপলব্ধি করে - তবে এটি একটি সাধারণ সমস্যা হতে হবে। কারও কি এমন কিছু সংক্ষিপ্ত কোড রয়েছে যা একটি পথ স্যানিটাইজ করে? সর্বাধিক বিশদ আমি এটি নিয়ে এসেছি, তবে মনে হচ্ছে এটি সম্ভবত অতিরিক্ত ওভারকিল।
// replaces invalid characters with replaceChar
public static string SanitizePath(string path, char replaceChar)
{
// construct a list of characters that can't show up in filenames.
// need to do this because ":" is not in InvalidPathChars
if (_BadChars == null)
{
_BadChars = new List<char>(Path.GetInvalidFileNameChars());
_BadChars.AddRange(Path.GetInvalidPathChars());
_BadChars = Utility.GetUnique<char>(_BadChars);
}
// remove root
string root = Path.GetPathRoot(path);
path = path.Remove(0, root.Length);
// split on the directory separator character. Need to do this
// because the separator is not valid in a filename.
List<string> parts = new List<string>(path.Split(new char[]{Path.DirectorySeparatorChar}));
// check each part to make sure it is valid.
for (int i = 0; i < parts.Count; i++)
{
string part = parts[i];
foreach (char c in _BadChars)
{
part = part.Replace(c, replaceChar);
}
parts[i] = part;
}
return root + Utility.Join(parts, Path.DirectorySeparatorChar.ToString());
}
এই ফাংশনটি দ্রুত এবং কম বারোক তৈরির জন্য যে কোনও উন্নতি করা হয়েছে তা প্রশংসিত হবে।