2009-06-20 4 views
7

Я позволяет пользователю выбрать любое имя он хочет, и это может быть что-либо вообще, таких какИдентификация файловой системы? C#

AC♀¿!$"Man'@ 

Теперь мне нужно создать каталог для него. Какую функцию я использую, чтобы избежать текста, поэтому я не проблема/исключение FS?

ответ

3

Используйте Path.GetInvalidFileNameChars или Path.GetInvalidPathChars, чтобы проверить удаление символов.

http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidfilenamechars.aspx

+0

И не забудьте проверить, существует ли каталог (проверьте наличие дубликатов "usernames"). – schnaader

+1

Это не помогает. Мне нужно бежать без потерь, удаление символов с потерями и может вызвать столкновение после того, как два разных имени удалены символами. – 2009-06-20 05:39:43

+4

Также обратите внимание, что в то время как GetInvalidPathChars() возвращает недопустимые символы, он не обязательно возвращает ВСЕ символы, которые являются недопустимыми. Цитата: «Массив, возвращенный из этого метода, не гарантирует, что будет содержать полный набор символов, которые недействительны в именах файлов и каталогов». – Bevan

1

Я думаю, что вам лучше всего было бы создать словарь, который отображает недопустимые символы файловой системы для правильной строки замены. Затем сканируйте строку для недопустимых символов, заменив действующими строками по ходу. Это позволит пользователю выбрать все, что захочет, и дать вам согласованность, чтобы перевести его обратно на имя пользователя, если хотите.

+0

Но обратите внимание, что вы должны иметь возможность сказать, какие символы были заменены впоследствии. Превращение $ User в DollarUser не поможет. – schnaader

+0

Верно, но вы можете создать последовательность символов, которые пользователь не сможет использовать.Как и в C#, когда компилятор испускает код для определенных вещей. – jasonh

0

пользователь должен знать точное название своего каталога? Если нет, почему бы не создавать каталоги с использованием произвольных правил и связывать их с владельцем в БД или что-то еще?

+0

Это будет работать, я всегда могу использовать userID вместо имени. Я просто хочу, чтобы имя bc было более читаемым для администраторов, хотя, возможно, бессмысленно. – 2009-06-20 05:47:49

5

В зависимости от того, являются ли ваши символы ASCII/Unicode, вы можете использовать байтовые/символьные значения в качестве замены и использовать символ, чтобы отметить эти замещенные символы (например, подчеркивание), давая вам что-то вроде _001_255_200ValidPart_095_253. Обратите внимание, что вы также должны заменить символы маркировки (_095 в примере, 95 - код ASCII для подчеркивания).

+0

Да, но выбор схемы кодирования тривиален. Трудно понять, какие персонажи должны бежать. –

+0

Хотя избежать слишком большого количества персонажей на самом деле здесь не повредит - так что вы можете f.e. просто используйте A-Z, a-z, 0-9 как действительные – schnaader

10

Если вы замените недопустимые символы или удалите их, всегда будет возможность столкновения. Если бы я был вами, у меня был бы отдельный первичный ключ для пользователя (возможно, GUID) и использовать его для имени каталога. Таким образом, вы можете иметь свои имена пользователей, что угодно, не беспокоясь о недопустимых именах каталогов.

+3

Почему downvote, анонимный пользователь? Я по-прежнему считаю, что это лучшее решение. В противном случае, Бобби и Бобби/оба получат один и тот же каталог, и это вызовет конфликт. – Jacob

+0

Вопрос был о стратегии экранирования текста, совместимой с правилами имен файлов. Избежание избежания вообще путем создания и поддержания отдельной структуры данных может быть решением проблемы, но не отвечает на вопрос. –

+2

Мех, я думаю, что люди в основном идут в Stack Overflow, чтобы найти решения своих проблем, а не просто ответы на их вопросы, как было задано. Если кто-то задает неправильный вопрос, например «как разобрать этот HTML-код с регулярным выражением», лучше указать на недостатки подхода. – Jacob

1

Вы не найдете способ избежать имени пользователя, которое даст действительное имя, не вызывающее конфликтов, в каждом экземпляре.

Более надежным подходом будет создание каталога с использованием некоторого условного соглашения, а затем сохранение сопоставления между ними. Это также обеспечивает поддержку случая, когда ваш пользователь хочет изменить имя.

Задать вопрос # 663520 для получения дополнительной информации об этом.