2010-06-21 7 views
6

Je veux vérifier si ma chaîne est le chemin de fichier Windows valide. Je cherchais autour et il semble qu'il n'y ait aucune méthode fiable pour le faire. J'ai également vérifié la bibliothèque de système de fichiers boost, et aucune fonction évidente n'existe pour faire cette vérification, peut-être quelque chose comme is_valid_windows_nameVérifiez le nom du fichier est le nom de Windows valide

+0

Avez-vous besoin de vérifier si le chemin fourni est juste valide, s'il est valide et si la structure du répertoire est déjà configurée pour le chemin, ou s'il existe déjà un fichier là? –

+0

Bonne peine. Ce n'est pas un doublon puisque l'autre est étiqueté C# et la réponse acceptée donne des API C#, alors que cela est étiqueté C++. –

+0

Que diriez-vous essayer de créer un fichier avec ce nom sur un Windows et voir si c'est un succès? (peut-être vous pouvez changer le chemin un peu pour l'essai seulement.) – cshu

Répondre

1

Vous pouvez utiliser la fonction _splitpath() et analyser la sortie (en fonction de cela, vous pouvez facilement dire si votre chemin est valide ou non). Pour plus d'informations, voir MSDN pour plus d'informations.

Notez que cette fonction est spécifique à Windows.

1

Je ne crois pas qu'il existe une API C++ standard pour cela.

Notez que l'API Windows autorise plus de noms de fichiers que le shell Windows (les noms de fichiers que l'utilisateur est autorisé à utiliser dans l'explorateur windws).

Vous devriez jeter un oeil à l'API shell de Windows.

Une autre possibilité est d'utiliser les essais et les erreurs, de cette façon vous êtes vraiment indépendant du système de fichiers actuel.

Le plus simple est de désavouer

\/<> | ": *

et vous devriez être bien

+1

et '*' et com, lpt, aux, con –

+0

mis à jour ma réponse :) – codymanix

1

Oui, il y a une fonction boost qui fait ce que vous voulez Jetez un oeil à boost :: filesystem :: windows_name (...)... Vous devez inclure boost/filesystem/path.hpp ainsi que le lien avec les bibliothèques correctes (spécifiques à la version et à l'architecture) libboost_system et libboost_filesystem puisque le chemin n'est pas une librairie en-tête seulement

+0

Boost pourrait être un peu beaucoup si c'était sa seule utilisation, mais Boost fournit de nombreuses fonctionnalités C++ de nouvelle génération, ce qui en vaut la peine pour le développement C++ général. Lorsque vous utilisez déjà Boost, c'est une excellente option. – sage

0

Dommage même la plus récente bibliothèque de systèmes de fichiers C++ 17 ne dispose pas d'une fonction permettant de vérifier les noms de fichiers

n utiliser les codes Shell Lightweight Utility functionPathFileExists spécifiques à Windows ou Windows APIGetFileAttributes et vérifier le dernier code d'erreur spécifiquement pour ERROR_INVALID_NAME.

Je pense que c'est un peu une mauvaise utilisation (parce qu'il devrait y avoir une fonction dédiée) mais sert le but.

+0

Pas si bon si le fichier n'existe pas encore. En outre, la sécurité peut empêcher son accès jusqu'à ce qu'il soit élevé. – CodeLurker

+0

@CodeLurker Pourquoi pas exactement?OP veut juste vérifier un nom de fichier Windows valide/chemin –

+0

OP ne dit rien à ce sujet existant déjà. Si ce n'est pas le cas, cela n'aidera pas. En outre, il se peut que nous voulions vérifier, même si nous n'y avons pas (encore) accès. Notez la solution que j'ai finalement retenue ici: https://stackoverflow.com/questions/3038351/check-whether-a-string-is-a-valid-filename-with-qt/45282192#45282192 – CodeLurker

Questions connexes