मैं हाल ही में विभिन्न स्थानों से एमपी के एक समूह को एक रिपॉजिटरी में स्थानांतरित कर रहा हूं। मैं ID3 टैग (धन्यवाद, TagLib-Sharp!) का उपयोग करके नए फ़ाइल नामों का निर्माण कर रहा था, और मैंने देखा कि मुझे एक मिल रहा था 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());
}
इस फ़ंक्शन को तेज़ और कम बारोक बनाने के लिए कोई भी सुधार बहुत सराहना की जाएगी।