2009-12-04 16 views
5

J'écris une application multi-plateforme qui doit inspecter et manipuler les chemins Windows. En particulier, pour le problème particulier que j'ai actuellement, j'ai besoin de savoir si un chemin est absolu ou relatif.Bibliothèque multi-plateforme pour la manipulation des chemins Windows?

Le code actuel utilise boost::filesystem::path qui bien sûr fonctionne comme un charme sur Windows:

boost::filesystem::path the_path(the_path_as_a_string); 
if (!the_path.has_root_path()) { /* do stuff */ } 

Le problème avec cette approche est que boost::filesystem::path n'a que deux modes: natifs et portables. Cela signifie que la grammaire du chemin Windows est indisponible lorsque je compile sous Linux (il est #ifdef dans la source). Par conséquent, le chemin "C: \ path" est considéré comme absolu dans Windows, mais relatif dans Linux. Pouvez-vous recommander une bibliothèque C++ multiplate-forme qui peut inspecter et manipuler les chemins d'accès Windows?



Pour l'instant, la seule opération de chemin de Windows que je vais faire est de vérifier si un chemin est absolu ou non.

Le critère que j'utiliserai pour un chemin absolu est qu'il contient tous les deux une lettre de lecteur et que le chemin commence par \. Un exemple de chemin absolu sous ce critère est C:\path. Ce sont deux exemples de chemins relatifs sous ce critère: C:path, \path.

+0

Vous savez que la distinction n'est pas ce noir et blanc? Considérons le chemin valide 'C: foo.txt'. Il utilise le répertoire de travail courant du lecteur C:! – MSalters

+1

MSalters: Je n'y avais pas pensé au moment où j'ai posé la question. Il semble aussi que l'auteur original du code que j'essaie de maintenir n'y ait pas pensé. Maintenant, je dois trouver le comportement que nous voulons vraiment ... –

Répondre

0

Il semble être difficile de trouver une bibliothèque pour cela. Une possibilité est PathIsRelative dans Winelib, mais je ne veux pas utiliser Winelib. J'ai fini par faire une solution très spécifique juste pour décider de cette petite chose. En supposant que le chemin est correct (une hypothèse juste dans mon cas), un chemin absolu contiendra :\, tandis qu'un chemin relatif ne le contiendra pas. Donc, la mauvaise solution, mais qui fonctionne, est la suivante: Il n'y a pas de bibliothèque appropriée. Vérifiez l'existence de :\.

1

Qu'en est-il de QT avec QFileInfo?

+0

Cela ressemble à la même hypothèse de base - et défaut - que booster; La grammaire Windows est disponible uniquement lors de la compilation sous Windows :( –

+0

Ensuite, compilez-le! :) – alexkr

0

Pourriez-vous élaborer sur ce que le programme est destiné à faire avec les chemins d'accès Windows sur Linux? Il est peut-être suffisant d'appliquer une simple transformation à la chaîne de chemin d'accès Windows, de la transformer de manière syntaxique en un chemin Unix, puis d'utiliser boost :: filesystem pour le manipuler.