44 votes

Comment sécuriser un chemin NSString (nom de fichier)

J'utilise des méthodes de combat très délicates :) pour créer une chaîne telle que "Fi? Le * / Name" sans danger pour un nom de fichier comme "File_Name". Je suis sûr qu'il existe un moyen de convertir le cacao. Et je suis sûr que le meilleur endroit pour demander est ici :)

Merci!

68voto

johnboiles Points 1482

Cela supprimera tous les caractères non valides n'importe où dans le nom du fichier en fonction du jeu de caractères non valide d'Ismail (je n'ai pas vérifié le degré de complétude de son jeu).

 - (NSString *)_sanitizeFileNameString:(NSString *)fileName {
    NSCharacterSet* illegalFileNameCharacters = [NSCharacterSet characterSetWithCharactersInString:@"/\\?%*|\"<>"];
    return [[fileName componentsSeparatedByCharactersInSet:illegalFileNameCharacters] componentsJoinedByString:@""];
}
 

Le mérite revient à Peter N Lewis pour l'idée d'utiliser des composantsSeparatedByCharactersInSet:
NSString - Convertir uniquement en alphabet pur (c.-à-d. Supprimer les accents + la ponctuation)

17voto

Peter Hosey Points 66275

Sauf si vous avez explicitement exécuter l'interpréteur de commandes ou implicitement de l'exécution de l'interpréteur de commandes à l'aide d'une fonction telle que popen ou system, il n'y a aucune raison d'échapper à quelque chose, mais le chemin d'accès du séparateur.

Vous pouvez également appliquer que le nom de fichier ne commence pas par un point (qui serait la cause du Finder pour cacher le fichier) et probablement aussi faire valoir qu'il n'est pas vide et est inférieur au nombre NAME_MAX caractères* long.

*syslimits.h dit octets, mais si vous allez par le biais du Gestionnaire de Fichiers, c'est les personnages. Je ne suis pas sûr de ce qui est bon pour le Cacao.

-3voto

Ismail Degani Points 260

Selon Wikipédia, les caractères les plus courants qui devraient être exclus des noms de fichiers sont:

/ \?% * | "<>

http://en.wikipedia.org/wiki/Nom de fichier

Etant donné que, et puisque l'opération invvertedSet dans la solution de rechange peut être intensive, voici une approche plus propre:

 NSCharacterSet *invalidFsChars = [NSCharacterSet characterSetWithCharactersInString:@"/\\?%*|\"<>"];
NSString *scrubbed = [originalStr stringByTrimmingCharactersInSet:invalidFsChars];
 

De cette façon, vous pouvez toujours autoriser les noms de fichiers avec tiret, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X