2009-06-20 27 views
7

sto permettendo all'utente di scegliere qualsiasi nome utente che vuole e può essere qualsiasi cosa, comeFile system filename escape? C#

AC♀¿!$"Man'@ 

Ora ho bisogno di creare una directory per lui. Quale funzione uso per uscire dal testo quindi non ho un problema/eccezione di FS?

risposta

3

Utilizzare Path.GetInvalidFileNameChars o Path.GetInvalidPathChars per verificare la rimozione dei caratteri.

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

+0

E assicuratevi di controllare se la directory esiste già (verificare la presenza di "nomi utente" duplicati). – schnaader

+1

Questo non aiuta. Ho bisogno di una fuga senza perdita, la rimozione dei caratteri è una perdita e può causare collisione dopo che due nomi diversi hanno caratteri rimossi –

+4

Si noti inoltre che mentre GetInvalidPathChars() restituisce caratteri non validi, non restituisce necessariamente TUTTI i caratteri che non sono validi. Citazione: "Non è garantito che la matrice restituita da questo metodo contenga il set completo di caratteri non validi nei nomi di file e directory". – Bevan

1

penso che la soluzione migliore sarebbe quella di creare un dizionario che mappa caratteri non validi filesystem ad una stringa di sostituzione valida. Quindi esamina la stringa per i caratteri non validi, sostituendoli con stringhe valide man mano che procedi. Ciò consentirebbe all'utente di scegliere tutto ciò che desidera e di fornire la coerenza per tradurlo nel nome dell'utente, se lo si desidera.

+0

Ma nota che devi essere in grado di dire quali caratteri sono stati sostituiti in seguito. Trasformare $ User in DollarUser non aiuterà. – schnaader

+0

Vero, ma è possibile creare una sequenza di caratteri che un utente non sarebbe autorizzato a utilizzare.Molto simile a C#, quando il compilatore emette il codice per determinate cose. – jasonh

0

l'utente deve conoscere il nome esatto della propria directory? In caso contrario, perché non creare directory utilizzando regole arbitrarie e associare ciascuna al suo proprietario in un DB o qualcosa del genere?

+0

Funzionerebbe, potrei sempre usare l'ID utente invece del nome. Voglio solo il nome bc è più leggibile per gli amministratori anche se forse inutile. –

5

A seconda che i caratteri siano ASCII/Unicode, è possibile utilizzare i valori di byte/carattere in sostituzione e utilizzare un carattere per contrassegnare questi caratteri sostituiti (come un carattere di sottolineatura), fornendo qualcosa come _001_255_200ValidPart_095_253. Notare che è necessario sostituire anche i caratteri di marcatura (nell'esempio _095, 95 è il codice ASCII per il carattere di sottolineatura).

+0

Sì, ma scegliere uno schema di codifica è banale. Quello che è difficile è sapere quali personaggi sfuggire. –

+0

Anche se sfuggire a troppi personaggi non farà davvero male qui - quindi puoi f.e. basta usare A-Z, a-z, 0-9 come validi – schnaader

10

Se si sostituiscono caratteri non validi o rimossi, c'è sempre la possibilità di collisioni. Se fossi in te, avrei una chiave primaria separata per l'utente (forse un GUID) e la userò per il nome della directory. In questo modo puoi avere il tuo nome utente tutto ciò che desideri senza preoccuparti di nomi di directory non validi.

+3

Perché il downvote, utente anonimo? Credo ancora che questa sia una soluzione migliore. In caso contrario, Bobby \ e Bobby/otterrebbero entrambi la stessa directory e ciò causerebbe un conflitto. – Jacob

+0

La domanda riguardava una strategia di escape di testo compatibile con le regole dei nomi dei file. Evitare di scappare del tutto creando e mantenendo una datastruttura separata può essere una soluzione al problema, ma non risponde alla domanda. –

+2

Meh, penso che le persone vadano principalmente a Stack Overflow per trovare soluzioni ai loro problemi, non solo le risposte alle loro domande come richiesto. Se qualcuno fa la domanda sbagliata, come "come faccio a analizzare questo HTML con un'espressione regolare", è meglio sottolineare i difetti nell'approccio. – Jacob

1

Non troverai un modo per sfuggire al nome utente che fornirà un nome di directory non incompatibile in ogni istanza.

Un approccio più affidabile sarà quello di creare la directory utilizzando alcune convenzioni arbitrarie e quindi memorizzare una mappatura tra i due. Questo fornisce anche il supporto per il caso in cui l'utente desidera la possibilità di cambiare nome.

Check out Domanda n. 663520 per ulteriori informazioni.

Problemi correlati