Мне нужен надежный и простой способ удалить недопустимые пути и символы файла из простой строки. Я использовал приведенный ниже код, но он, похоже, ничего не делает, что мне не хватает?
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();
}
}
}
GetInvalidFileNameChars()
удалит такие вещи как: \ etc из путей к папкам.Path.GetInvalidPathChars()
кажется, не раздеться*
или?
Ответы:
Попробуйте что-то вроде этого вместо этого;
Но я должен согласиться с комментариями, вероятно, я бы попытался разобраться с источником нелегальных путей, а не пытаться превратить нелегальный путь в законный, но, вероятно, непреднамеренный.
Изменить: Или потенциально «лучшее» решение, используя Regex's.
Тем не менее, возникает вопрос, почему вы делаете это в первую очередь.
источник
GetInvalidPathChars()
бы в нем содержались символы,GetInvalidFileNameChars()
которых не было бы. Вы не принимаете правильность над «преждевременной» оптимизацией. Вы просто используете плохой код.Оригинальный вопрос, заданный для «удаления недопустимых символов»:
Вместо этого вы можете заменить их:
Этот ответ был на другой ветке от Цереры , мне очень нравится это аккуратно и просто.
источник
Я использую Linq для очистки имен файлов. Вы можете легко расширить это, чтобы проверить правильные пути также.
Обновить
Некоторые комментарии указывают, что этот метод не работает для них, поэтому я включил ссылку на фрагмент DotNetFiddle, чтобы вы могли проверить метод.
https://dotnetfiddle.net/nw1SWY
источник
var invalid = new HashSet<char>(Path.GetInvalidPathChars()); return new string(originalString.Where(s => !invalid.Contains(s)).ToArray())
. Производительность, вероятно, не велика, но это, вероятно, не имеет значения.Вы можете удалить незаконные символы с помощью Linq следующим образом:
РЕДАКТИРОВАТЬ
Вот как это выглядит с необходимым редактированием, упомянутым в комментариях:
источник
Все это отличные решения, но они все полагаются
Path.GetInvalidFileNameChars
, что может быть не так надежно, как вы думаете. Обратите внимание на следующее замечание в документации MSDNPath.GetInvalidFileNameChars
:Это не лучше с
Path.GetInvalidPathChars
методом. Он содержит точно такое же замечание.источник
Для имен файлов:
Для полных путей:
Обратите внимание, что если вы намереваетесь использовать это как функцию безопасности, более надежный подход будет состоять в том, чтобы развернуть все пути и затем убедиться, что указанный пользователем путь действительно является дочерним для каталога, к которому у пользователя должен быть доступ.
источник
Для начала, Trim удаляет только символы из начала или конца строки . Во-вторых, вы должны оценить, действительно ли вы хотите удалить оскорбительные символы или быстро потерпеть неудачу и сообщить пользователю, что их имя файла недействительно. Мой выбор - последний, но мой ответ должен, по крайней мере, показать вам, как делать вещи правильно И неправильно:
Вопрос StackOverflow, показывающий, как проверить, является ли данная строка допустимым именем файла . Обратите внимание, что вы можете использовать регулярное выражение из этого вопроса, чтобы удалить символы с заменой регулярного выражения (если вам действительно нужно это сделать).
источник
Лучший способ удалить недопустимый символ из пользовательского ввода - заменить недопустимый символ с помощью класса Regex, создать метод в коде или также проверить его на стороне клиента с помощью элемента управления RegularExpression.
ИЛИ
источник
Я использую регулярные выражения для достижения этой цели. Во-первых, я динамически строю регулярное выражение.
Затем я просто вызываю removeInvalidChars.Replace, чтобы найти и заменить. Это, очевидно, может быть расширено и для символов пути.
источник
new Regex(String.Format("^(CON|PRN|AUX|NUL|CLOCK\$|COM[1-9]|LPT[1-9])(?=\..|$)|(^(\.+|\s+)$)|((\.+|\s+)$)|([{0}])", Regex.Escape(new String(Path.GetInvalidFileNameChars()))), RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.CultureInvariant);
Я абсолютно предпочитаю идею Джеффа Йейтса. Это будет работать отлично, если вы немного измените его:
Улучшение состоит в том, чтобы избежать автоматически сгенерированного регулярного выражения.
источник
Вот фрагмент кода, который должен помочь для .NET 3 и выше.
источник
Большинство решений выше объединяют недопустимые символы как для пути, так и для имени файла, что неверно (даже если оба вызова в настоящее время возвращают один и тот же набор символов). Сначала я бы разделил путь + имя файла на путь и имя файла, затем применил соответствующий набор к любому из них, а затем снова объединил их.
wvd_vegt
источник
Если вы удалите или замените одним символом недопустимые символы, вы можете столкнуться:
Вот простой способ избежать этого:
Результат:
источник
Брось исключение.
источник
Я написал этого монстра для забавы, он позволяет вам туда и обратно:
источник
Я думаю, что гораздо проще проверить, используя регулярные выражения и указав, какие символы разрешены, вместо того, чтобы пытаться проверить все плохие символы. Смотрите эти ссылки: http://www.c-sharpcorner.com/UploadFile/prasad_1/RegExpPSD12062005021717AM/RegExpPSD.aspx http://www.windowsdevcenter.com/pub/a/oreilly/windows/news/csharp_0101.html
Кроме того, выполните поиск «редакторов регулярных выражений», они очень помогают. Есть некоторые, которые даже выводят код на C # для вас.
источник
Это, кажется, O (n) и не тратит слишком много памяти на строки:
источник
Просматривая ответы здесь, все они **, похоже, используют массив символов недопустимых символов имени файла.
Конечно, это может быть микрооптимизацией, но для тех, кто хочет проверить большое количество значений на предмет допустимости имен файлов, стоит отметить, что создание хэш-набора недопустимых символов приведет к заметному повышению производительности.
В прошлом я был очень удивлен (шокирован) тем, насколько быстро хешсет (или словарь) превосходит итерации по списку. Со строками это смехотворно мало (около 5-7 пунктов по памяти). С большинством других простых данных (ссылки на объекты, числа и т. Д.) Магический кроссовер, кажется, составляет около 20 предметов.
В списке «Path» .InvalidFileNameChars содержится 40 недопустимых символов. Сделал поиск сегодня, и здесь есть довольно хороший тест на StackOverflow, который показывает, что хэш-сет займет чуть более половины времени массива / списка для 40 элементов: https://stackoverflow.com/a/10762995/949129
Вот вспомогательный класс, который я использую для очистки путей. Теперь я забываю, почему у меня была такая необычная возможность замены, но это было милым бонусом.
Дополнительный бонусный метод "IsValidLocalPath" тоже :)
(** те, которые не используют регулярные выражения)
источник
Вы можете использовать метод четко.
источник
Имя файла не может содержать символы из
Path.GetInvalidPathChars()
,+
и#
символы, и другие конкретные имена. Мы объединили все проверки в один класс:Метод
GetValidFileName
заменяет все неверные данные на_
.источник
Один вкладыш для очистки строки от любых недопустимых символов для именования файлов Windows:
источник
источник
Это будет хотеть, что вы хотите, и избежать столкновений
источник
Я думаю, что вопрос уже не полностью ответил ... Ответы описывают только чистое имя файла или путь ... не оба. Вот мое решение:
источник
Я создал метод расширения, который объединяет несколько предложений:
Источник:
источник
Вот функция, которая заменяет все недопустимые символы в имени файла символом замены:
Например, подчеркивание может использоваться как символ замены:
источник
Или вы можете просто сделать
источник