Comment vérifier si une chaîne est valide chemin d'accès du fichier ou le chemin du répertoire de format dans le C++ code?
Je veux savoir comment faire pour vérifier (unmanaged code Visual C++) si une chaîne est un format valide pour représenter le chemin d'accès du fichier ou le chemin d'accès au dossier. La physique de fichier ou chemin d'accès au dossier lui-même peut ou ne peut pas exister dans ce cas. Pour vérifier le format de chaîne appropriée est l'objectif majeur dans mon cas. J'ai besoin de savoir si une chaîne est un bon format pour être valide chemin d'accès au fichier ou il n'a pas? Il y a beaucoup de posts à ce sujet pour le C#, mais pas un pour le C++. Comment le faire en C++ dans Visual C++?
En c++, vous pouvez essayer d'utiliser
Une chaîne est un chemin d'accès valide. Ce serait un exemple de quelque chose, il doit la rejeter?
Par exemple: "C:\MainFolder\MyFolder\myTextFile.txt" ou "MyFolder\myTextFile.txt" sont des chemins absolus et relatifs en conséquence. Mais "C:^^>\:_Wrong_path" est mauvais exemple de trajet.
stackoverflow.com/questions/1976007/... Remarque vous ne pouvez pas vérifier avec une fiabilité à 100%, un système de fichiers peut imposer ses propres restrictions.
"l'objectif majeur" pourquoi?
regex
pour ce faire.Une chaîne est un chemin d'accès valide. Ce serait un exemple de quelque chose, il doit la rejeter?
Par exemple: "C:\MainFolder\MyFolder\myTextFile.txt" ou "MyFolder\myTextFile.txt" sont des chemins absolus et relatifs en conséquence. Mais "C:^^>\:_Wrong_path" est mauvais exemple de trajet.
stackoverflow.com/questions/1976007/... Remarque vous ne pouvez pas vérifier avec une fiabilité à 100%, un système de fichiers peut imposer ses propres restrictions.
"l'objectif majeur" pourquoi?
OriginalL'auteur user3769902 | 2014-12-21
Vous devez vous connecter pour publier un commentaire.
Le SEUL 100% certaine manière, elle est "d'essayer". Vous pouvez écrire du code pour déterminer les cas les plus simples, mais il y aura toujours des rides que vous avez besoin pour traiter, à moins que vous AUSSI de savoir ce système de fichiers du lecteur, c'est que le fichier sur la vie, qui, depuis Windows permet de "jonctions", analyse le chemin d'accès complet vers le bas pour la partie finale.
Il est beaucoup plus simple de le faire :
Si vous voulez vraiment être de fantaisie, vous pouvez prendre un coup d'oeil à
errno
si c'était "nom de fichier non valide" ou "le fichier n'existe pas". Mais en général, il est inutile d'essayer de deuxième deviner la validité d'un nom de fichier et le chemin d'accès, car il y a trop de règles qui peuvent ou peuvent ne pas s'appliquer à VOTRE cas particulier.Cela devient encore plus compliqué si vous avez des répertoires "à mi-chemin" qui n'existe pas. Vous souhaitez simplement avoir à analyser le chemin et essayer de créer le répertoire sur la façon dont [et de la supprimer à nouveau si l'ensemble du processus échoue]. Toutefois, cette situation est encore compliquée par le fait que vous avez à traiter avec les non-canonique chemins. Est
c:\blah\..\.\foo\..\bar\xxx.9\..\..\bleurgh\papa.txt
un nom de fichier valide? Pour résoudre ce vous devez d'ABORD accepter le nom.PathCanonicalize
ou vos amis pourraient aider avec ceci. Mais il est encore plein de méchant compliqué bits qui sont TRÈS difficiles à résoudre.Bien sûr, vous pouvez essayer d'écrire une regex ou quelque chose à attraper les cas simples, mais vous aurez encore se retrouver avec des cas qui sont difficiles à comprendre.
Noter qu'il existe des situations où un chemin peut sembler valide, mais n'est-ce pas. Imaginez que nous avons cette voie:
c:\directory\foo\bar.txt
. Maintenant, qui semble parfaitement valable, nous avons peut-être créerc:\direoctry
etfoo
à l'intérieur de cela. Mais que faire sic:\directory\foo
est un fichier déjà existant? Voulez-vous supprimer le fichier et de créer un répertoire à sa place? Ou voulez-vous dire que c'est "bien" et puis échouer lorsque vous essayez de créer le répertoire? Je ne connais pas la réponse, et ce genre de complication est pourquoi je dis "la seule façon de s'en assurer est de l'essayer" - tout le reste est juste chasser de votre queue, ou le rapprochement de l'exactitude.Et bien sûr, ça devient encore plus compliqué si l'on prend les autorisations de fichier en compte.
[Et erenon fait un bon point, même si vous vérifiez maintenant, entre le point de vous de vérifier quelque chose, et que vous avez réellement commencer à utiliser votre chemin, vous pouvez très bien avoir eu des changements à la structure de répertoire de décisions déjà un nom valide non valide - ou vice versa - ce genre de problème est souvent appelé "TOCTOU" - "le Temps de Vérification et d'Utilisation"]
Parce qu'il peut être "nuls" en raison de la mauvaise "vers le répertoire", par exemple 'c:\..\foo.txt' est pas valide, mais ne contient pas toutes les combinaisons erronées...
En fait
PathCanonicalize
sera, au moins dans une certaine mesure, également valider le nom, et le retourFALSE
si le nom n'est pas valide. Je ne suis pas convaincu que cela est suffisant pour assurer "toujours bon nom", mais c'est un début.Je prétends que la 'C:\..\foo.txt" est valide du point de vue format, même si elle peut être invalide en ce qui concerne le fichier de l'existance. J'ai lu la question "j'ai une chaîne de caractères et la syntaxe du chemin d'accès, mais pas de système de fichiers à vérifier, est-ce de la chaîne ont syntaxe correcte".
Bon, donc cela dépend de ce que vous essayez d'atteindre. Et oui, il peut très bien être correct, ce que vous dites, et qu'une vérification doit accepter ce chemin. Mais c'est toujours non valide sur TOUS les Windows fichier-système actuellement en existence.
OriginalL'auteur Mats Petersson
Si vous intégrez une version récente de boost, vous pouvez utiliser le système de fichiers qui fait le travail pour vous et prend soin de tous les problèmes habituels (\ vs \\ etc...).
Il fournit également quelques autres équipements (de la taille du fichier, les permissions, etc...)
Voici le lien.
http://www.boost.org/doc/libs/1_47_0/libs/filesystem/v3/doc/tutorial.html
Il devrait être dans l'officiel C++ à un certain point, tous les détails ici.
http://en.cppreference.com/w/cpp/experimental/fs
Espère que ça aide,
exists
est une telle épopée abus de langage. Non, le code n'est pas de vérifier si un fichier existe. Il vérifie, si un fichier est accessibilité, ou au moins interrogeable. Supposons que le jeton de sécurité de l'appelant de votre code ne donne pas accès à C:\Temp. À ce point de votre échec, même si myExample.txt pourrait très bien être là.OriginalL'auteur Gabriel
Je pense que la réponse de Tapis de Petersson décrit la véritable réponse. Je tiens à souligner une erreur commune. Assumer la fonction suivante:
Puis en l'utilisant de cette façon:
Il y a une énorme condition de course ici.
myFile
peut devenir non valide après la vérification, mais avant de l'utiliser. La seule façon de s'assurer qu'il n'existe pas d'ouvrir et de garder le descripteur de fichier autour de.OriginalL'auteur erenon