6
votes

Pourquoi qfile ne peut-il pas lire du répertoire "~"?

J'ai essayé le court exemple suivant pour connaître un bogue dans un programme plus gros que je travaille. Il semble que QFile ne prend pas en charge la notation Unix (ou la coquille) pour le répertoire de base: xxx

dès que je remplace le "~" avec mon vrai chemin de répertoire de maison, cela fonctionne. Existe-t-il une solution de contournement facile - certains paramètres pour activer? Ou est-ce que je dois aller à la manière "laide" et demander à qdir pour le répertoire de base de l'utilisateur actuel et préparer cela manuellement à chaque chemin?

addendum: Il est clair que La coquille effectue l'expansion de Tilde afin que les programmes ne voient jamais cela. Néanmoins, il est tellement pratique dans les coquilles UNIX que j'ai espéré que la mise en œuvre de QT pour l'accès au fichier aurait cette expansion incluse.


1 commentaires

Il peut être utile d'implémenter opérateur / (qdir, std :: string) afin que vous puissiez écrire qdir :: homepath () / ". VIMRC"


4 Réponses :


3
votes

Cela n'a rien à voir avec ne pas supporter UNIX; L'expansion des tildes au répertoire de base de l'utilisateur est une substitution effectuée par la coque, donc oui, vous devrez les remplacer manuellement.


1 commentaires

Oui, je sais que c'est une expansion de shell. Mais il est tellement pratique que j'espérais que la mise en œuvre de l'UNIX QT soutiendrait et développerait sur le tilde.



0
votes

Jetez un oeil à la fonction de la bibliothèque C glob , qui fera une expansion de tilde (et éventuellement une expansion générique et diverses autres fonctions).


2 commentaires

Je suppose que cela impliquera d'excaper d'autres caractères spéciaux de globe spéciaux que je ne veux pas violer avec. Et je dois gérer plusieurs entrées dans la liste retournée, car GLOB ne retournera pas une seule chaîne (mais une liste ne contenant probablement qu'une seule chaîne).


Cela dépend de votre système d'exploitation; Par exemple, OS X a un drapeau glob_limit, qui vous permettra de ne demander qu'un seul résultat. Pour ce qui peut être une fonction encore plus utile, essayez Wordexp , ce qui vous permet de faire la majeure partie de ce que le shell fait dans la construction de commandes.



11
votes

Vous pouvez simplement créer une fonction d'assistant pour le faire pour vous, quelque chose comme: xxx

une solution plus complète, permettant aux annuaires de la maison de autres utilisateurs Eh bien, peut être: xxx


juste une chose à garder à l'esprit, la solution actuelle n'est pas portable à Windows (selon les commentaires du code). Je suppose que c'est correct pour la question immédiate depuis .vimrc indique que ce n'est pas la plate-forme que vous utilisez (c'est _vimrc sous Windows).

L'adaptation de la solution à cette plate-forme est possible et montre en effet que la solution d'assistance est une bonne ajustement car vous ne devez modifier que un morceau de code pour ajouter cela. < / p>


9 commentaires

Pendant que j'aime l'idée, il deviendra encombrant lorsque vous manipulez des cas tels que "~ utilisateur", etc ...


Votre code ne devrait probablement pas tenter de violer dans un répertoire d'un autre utilisateur de toute façon :-) Mais oui, si vous souhaitez que les extensions complètes, vous aurez probablement besoin de sortir à la coquille pour les obtenir. Je répondais seulement à l'affaire spécifique de votre question, celle de ~ . Néanmoins, si vous avez besoin de toute la gamme, c'est toujours meilleur pour isoler le code à cette seule fonction d'aide. Si c'est juste ~ / , utilisez ce que j'ai donné. Si c'est ~ , trouvez une autre solution dans la fonction, telle que l'exécution d'un sous-(-shell pour récupérer la valeur de celui-ci. Je ne peux pas voir une façon moins encombrante de faire ce que tu veux.


En d'autres termes, même si QT a fourni cette fonctionnalité, cela le ferait probablement la façon dont je suggère (bien que peut-être un peu plus de plate-forme multipliée).


Eh bien, vous pouvez faire une recherche pwent ou quelque chose, je suis sûr. Comme un quickfix, je vais avec qstring ("% 1 / anvimrc"). Arg (qdir :: homepath ())). Je vais étudier une solution plus élégante plus tard. Peut-être que quelqu'un le pose. ;-)


@paxdiablo: tandis que ~ ~ L'utilisateur peut être utilisé pour définir la maison de «utilisateur», qui n'est pas aussi largement utilisé que simple ~ pour faire référence à votre propre répertoire personnel. Quoi qu'il en soit, vous pouvez détecter la différence en recherchant ~ comme premier caractère, puis vérifiant si le deuxième caractère est / ou non. Traiter avec ~ utilisateur obtiendrait beaucoup de messier ... mais vous pouvez au moins le détecter et vous plaindre :)


D'accord, j'ai ajouté du code (non testé) qui devrait également se rapprocher de la manipulation d'autres utilisateurs. N'oubliez pas que ce n'est pas le fil de sécurité, vous devez utiliser les versions _r si vous le souhaitez. En fait, cela ne peut même pas compiler, mais c'est un bon départ :-) N'hésitez pas à modifier une fois que vous le souhaitez (ou laissez-moi savoir les problèmes et je vais les réparer moi-même). Acclamations.


@paxdiablo: Si l'utilisateur met ~ foo / bar.baz dans un fichier de configuration (ou l'entre dans une boîte de dialogue; j'ai dû faire face à cela dans le passé) alors ce n'est pas la place du programmeur dire «Ne plaisantez pas dans les annuaires de domicile des autres personnes». Laissez avoir déclaré que au système d'exploitation, ou peut-être que l'autre utilisateur aura réellement accordé la permission de ce dossier. Ce genre de chose arrive lorsque le code frappe le sol.


@Donal, je ne suis pas sûr si vous avez remarqué le smiley à la fin de cette phrase. Mais vous soulevez un bon point, qui est, espérons-le maintenant maintenant dans la réponse mise à jour.


La question ne concerne pas si l'on devrait ou ne devrait pas piquer dans d'autres annuaires d'utilisateurs. Dans ce cas, j'en ai besoin de partager certains modèles d'impression entre les utilisateurs avec un utilisateur capable de garder et d'éditer dans son domaire. Cependant, ce ne sera pas une solution permanente, elle sera remplacée plus tard.



2
votes

Veuillez soumettre une suggestion au QT BugTracker.

https://bugreports.qt.io/


0 commentaires