С# Удалить недопустимые символы из имени файла
У меня есть данные, поступающие из поля 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;
}
Ответы
Ответ 1
нет недопустимых символов, возвращаемых 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/
Я снова подозреваю, что вы увидите символы с кодами размером более 128, и вы должны исключить их из своей строки.
Ответ 2
Вот функция, которую я использую в статическом общем классе:
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);
}
Ответ 3
Попробуйте это
filename = Regex.Replace(filename, "[\/?:*""><|]+", "", RegexOptions.Compiled)