2011-03-21 25 views
12

Utilizando C++, necesito detectar si la ruta de acceso (nombre de archivo) es absoluta o relativa. Puedo usar la API de Windows, pero no quiero usar bibliotecas de terceros como Boost, ya que necesito esta solución en una pequeña aplicación de Windows sin dependencias experimentales.Detecta si la ruta es absoluta o relativa

+5

Felicitaciones por [no poner mucho esfuerzo en su investigación] (http://msdn.microsoft.com/en-us/library/bb773660%28v=vs.85%29.aspx). –

+2

@Tomalak Geret'kal - ¿Cuál es su pont en "no poner mucho esfuerzo"? De todos modos, el mismo enlace ya está publicado como respuesta, realmente aprecio tu esfuerzo, gracias amigo. –

+0

@AlexFarber: Su punto es que una búsqueda en Google lo habría llevado al lugar correcto si lo hubiera intentado. –

Respuesta

20

La API de Windows tiene PathIsRelative. Se define como:

BOOL PathIsRelative(
    _In_ LPCTSTR lpszPath 
); 
+0

Hmm. Lol'd un poco. –

+2

@LightnessRacesinOrbit: Aunque funcionaría en el 99% de los casos, no es una solución perfecta. Aquí hay dos razones principales por las cuales: 1. Técnicamente debería haber tres opciones de devolución: 'yes',' no', y 'error determination'. 2. Esta limitación: 'longitud máxima MAX_PATH'. Lamentablemente, no encontré una API de Windows que pudiera hacer esto de manera confiable ... – ahmd0

2

Comenzando con C++ 14/C++ 17 puede utilizar is_absolute() y is_relative() de la filesystem library

#include <filesystem> // C++17 (or Microsoft-specific implementation in C++14) 

std::string winPathString = "C:/tmp"; 
std::filesystem::path path(winPathString); // Construct the path from a string. 
if (path.is_absolute()) { 
    // Arriving here if winPathString = "C:/tmp". 
} 
if (path.is_relative()) { 
    // Arriving here if winPathString = "". 
    // Arriving here if winPathString = "tmp". 
    // Arriving here in windows if winPathString = "/tmp". (see quote below) 
} 

La trayectoria "/" es absoluta en una POSIX OS, pero es relativo en Windows.

En C++ 14 uso std::experimental::filesystem

#include <experimental/filesystem> // C++14 

std::experimental::filesystem::path path(winPathString); // Construct the path from a string. 
0

I tienen impulsar 1,63 y VS2010 (C++ pre C++ 11), y funciona el código siguiente.

std::filesystem::path path(winPathString); // Construct the path from a string. 
if (path.is_absolute()) { 
    // Arriving here if winPathString = "C:/tmp". 
} 
Cuestiones relacionadas