C # Удалить недопустимые символы из имени файла - PullRequest
15 голосов
/ 30 сентября 2010

У меня есть данные, поступающие из поля nvarchar базы данных сервера SQL через EF3.5.Эта строка используется для создания имени файла и требует удаления недопустимых символов и пробует следующие опции, но ни один из них не работает.Пожалуйста, предложите, почему это такая понятная загадка?Я делаю что-то не так?

Я рассмотрел почти все связанные вопросы на этом сайте ... и теперь публикую сводный вопрос по всем предложениям / ответам по другим аналогичным вопросам.

UPD: проблема не связана. Все эти варианты работают.Так что публикуем его в вики сообщества.

public static string CleanFileName1(string filename)
{            
    string file = filename;                                            
    file = string.Concat(file.Split(System.IO.Path.GetInvalidFileNameChars(), StringSplitOptions.RemoveEmptyEntries));

    if (file.Length > 250)
    {
        file = file.Substring(0, 250);
    }
    return file;
 }

public static string CleanFileName2(string filename)
{
    var builder = new StringBuilder();
    var invalid = System.IO.Path.GetInvalidFileNameChars();
    foreach (var cur in filename)
    {
        if (!invalid.Contains(cur))
        {
            builder.Append(cur);
        }
    }
    return builder.ToString();
}

public static string CleanFileName3(string filename)
{                                    
    string regexSearch = string.Format("{0}{1}",
        new string(System.IO.Path.GetInvalidFileNameChars()),
        new string(System.IO.Path.GetInvalidPathChars()));
    Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch)));
    string file = r.Replace(filename, "");

    return file;
}       

public static string CleanFileName4(string filename)
{
    return new String(filename.Except(System.IO.Path.GetInvalidFileNameChars()).ToArray());
}   

public static string CleanFileName5(string filename)
{            
    string file = filename;

    foreach (char c in System.IO.Path.GetInvalidFileNameChars())
    {
        file = file.Replace(c, '_');
    }                                 
    return file;
}   

Ответы [ 3 ]

27 голосов
/ 24 декабря 2011

Вот функция, которую я использую в общем статическом классе:

public static string RemoveInvalidFilePathCharacters(string filename, string replaceChar)
{
    string regexSearch = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
    Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch)));
    return r.Replace(filename, replaceChar);
}
4 голосов
/ 30 сентября 2010

Попробуйте это

filename = Regex.Replace(filename, "[\/?:*""><|]+", "", RegexOptions.Compiled)

3 голосов
/ 30 сентября 2010

нет недопустимых символов, возвращаемых System.IO.Path.GetInvalidFileNameChars () при удалении.- Бхуван 5 минут назад

Первый опубликованный вами метод работает нормально для символов в Path.GetInvalidFileNameChars(), вот он на работе:

static void Main(string[] args)
{
    string input = "abc<def>ghi\\1234/5678|?9:*0";

    string output = CleanFileName1(input);

    Console.WriteLine(output); // this prints: abcdefghi1234567890

    Console.Read();
}

Полагаю, что ваша проблемас некоторыми специфическими для языка специальными символами.Вы можете попытаться устранить эту проблему, распечатав коды ASCII символов в вашей строке:

string stringFromDatabase = "/5678|?9:*0"; // here you get it from the database

foreach (char c in stringFromDatabase.ToCharArray())
    Console.WriteLine((int)c);

и обратившись к таблице ASCII: http://www.asciitable.com/

I снова подозреваем, что вы увидите символы с кодами больше 128, и вы должны исключить их из своей строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...