Comment puis-je désinfecter une chaîne pour l'utiliser comme un nom de fichier?
J'ai une routine qui convertit un fichier dans un autre format et l'enregistre. L'original de fichiers de données ont été numérotées, mais ma routine donne à la sortie d'un nom de fichier basé sur un nom interne trouvée dans l'original.
J'ai essayé de lot-exécuter sur un répertoire entier, et il a bien fonctionné jusqu'à ce que j'ai touché un fichier dont le nom avait une barre oblique en elle. Oups! Et si il le fait ici, il pourrait facilement le faire sur d'autres fichiers. Est-il à RTL (ou WinAPI) de la routine, quelque part, qui permettra de désinfecter une chaîne et de supprimer les symboles non valides sorte qu'il est sûr à utiliser comme un nom de fichier?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser PathGetCharType fonction, PathCleanupSpec fonction ou l'astuce suivante:
Ce code divise une chaîne en pièces et utilise MoveFile de vérifier chaque partie. MoveFile échouera pour les caractères non valides ou des noms de fichier réservés (comme 'COM') et le retour de la réussite ou de ERROR_ALREADY_EXISTS pour le nom de fichier valide.
PathCleanupSpec est dans le Jedi de l'API Windows sous Win32API/JwaShlObj.pas
nil
que le premier paramètre deMoveFile()
est sans-papiers comportement. Aussi, ne pas cocherGetLastError()
saufMoveFile()
retourne FALSE en premier, ce qui ce code n'est pas vérifier.Quant à la question de savoir s'il existe une fonction de l'API pour désinfecter un fichier d'un nom (ou même vérifier sa validité) - il semble y avoir aucun. Citant le commentaire sur le PathSearchAndQualify() fonction:
De sorte que vous pouvez seulement consulter les règles pour le nom de fichier de la validité de Les Noms de fichier, des Chemins et des espaces de noms (Windows):
Utiliser presque n'importe quel caractère dans la page de code pour un nom, y compris des caractères Unicode et les caractères dans le jeu de caractères étendus (de 128 à 255), à l'exception des suivantes:
< > : "/\ | ? *
Ne l'utilisez pas les noms de périphérique réservé pour le nom d'un fichier:
CON
,PRN
,AUX
,NUL
,COM1..COM9
,LPT1..LPT9
.Aussi éviter ces noms suivie immédiatement par une extension; par exemple,
NUL.txt
n'est pas recommandé.Si vous savez que votre programme ne jamais écrire sur des systèmes de fichiers NTFS, vous pouvez probablement être sûr qu'il n'y a pas d'autres caractères que le système de fichiers ne permet pas, donc vous n'avez qu'à vérifier que le nom de fichier n'est pas trop long (utiliser le
MAX_PATH
constante) après tous les caractères non valides ont été retirées (ou remplacé par des traits de soulignement, par exemple).Un programme doit également s'assurer que le nom de fichier de la désinfection de ne pas entraîner de nom de fichier conflits et en silence écrase les autres fichiers qui s'est terminé avec le même nom.
Vérifier si la chaîne est non valide caractères; solution de ici:
Et, pour les chaînes de retourner Faux, vous pourriez faire quelque chose de simple comme cette pour chaque caractère non valide:
Pour quelqu'un d'autre de le lire et qui veulent utiliser la PathCleanupSpec, j'ai écrit ce test de routine qui semble fonctionner... il y a toujours influencé manque pas d'exemples sur le net.
Vous devez inclure ShlObj.pas (vous ne savez pas quand PathCleanupSpec a été ajouté, mais j'ai testé en Delphi 2010)
Vous aurez aussi besoin de vérifier pour XP sp2 ou supérieur
Bien, la chose la plus facile est d'utiliser une expression régulière et la langue de votre choix de la version de
gsub
pour remplacer tout ce qui n'est pas un "caractère de mot." Cette classe de personnage serait "\w
" dans la plupart des langues avec Perl-comme regexes, ou "[A-Za-z0-9]
" comme une simple option contraire.En particulier, contrairement à certains des exemples dans d'autres réponses, vous ne voulez pas regarder pour les caractères non valides pour les supprimer, mais regardez pour les caractères valides pour les garder. Si vous êtes à la recherche pour les caractères non valides, vous êtes toujours vulnérable à l'introduction de nouveaux personnages, mais si vous êtes à la recherche pour les seuls valables, vous pourriez être un peu moins inefficace (que vous avez remplacé un personnage que vous n'avez pas vraiment besoin), mais au moins vous ne serez jamais mal.
Maintenant, si vous voulez faire de la nouvelle version un peu comme le vieux possible, vous pourriez envisager de remplacement. Au lieu de les supprimer, vous pouvez le remplacer par un personnage que vous connaissez bien. Mais cela est un intéressant problème assez que c'est probablement un bon sujet pour une autre question.
Je l'ai fait:
Essayer cela sur une moderne delphi:
Je me permet aussi d'avoir des accents ou autres caractères comme -, _,.. dans un nom de fichier.