1. ホーム
  2. c#

[解決済み】パス名やファイル名から不正な文字を削除するには?

2022-03-23 11:24:24

質問

単純な文字列から不正なパスとファイル文字を削除する、堅牢でシンプルな方法が必要です。以下のコードを使用しましたが、何もしていないようです。

using System;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string illegal = "\"M<>\"\\a/ry/ h**ad:>> a\\/:*?\"<>| li*tt|le|| la\"mb.?";

            illegal = illegal.Trim(Path.GetInvalidFileNameChars());
            illegal = illegal.Trim(Path.GetInvalidPathChars());

            Console.WriteLine(illegal);
            Console.ReadLine();
        }
    }
}

解決方法は?

代わりに以下のようなものを試してみてください。

string illegal = "\"M\"\\a/ry/ h**ad:>> a\\/:*?\"| li*tt|le|| la\"mb.?";
string invalid = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());

foreach (char c in invalid)
{
    illegal = illegal.Replace(c.ToString(), ""); 
}

しかし、私はコメントに同意せざるを得ません。私なら、違法なパスを合法的だがおそらく意図していないものにこじつけるのではなく、違法パスの発生源を何とかしようとするでしょうね。

Edit: Regexを使った「より良い」解決策もあります。

string illegal = "\"M\"\\a/ry/ h**ad:>> a\\/:*?\"| li*tt|le|| la\"mb.?";
string regexSearch = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch)));
illegal = r.Replace(illegal, "");

それでも、そもそもなぜこんなことをするのか、という疑問が湧いてきます。