Is there a Windows API function to extract the drive letter from a Windows path such as
U:\path\to\file.txt
\\?\U:\path\to\file.txt
while correctly sorting out
relative\path\to\file.txt:alternate-stream
etc?
Is there a Windows API function to extract the drive letter from a Windows path such as
U:\path\to\file.txt
\\?\U:\path\to\file.txt
while correctly sorting out
relative\path\to\file.txt:alternate-stream
etc?
PathGetDriveNumber returns 0 through 25 (corresponding to 'A' through 'Z') if the path has a drive letter, or -1 otherwise.
Here is code that combines the accepted answer (thanks!) with PathBuildRoot
to round out the solution
#include <Shlwapi.h> // PathGetDriveNumber, PathBuildRoot
#pragma comment(lib, "Shlwapi.lib")
/** Returns the root drive of the specified file path, or empty string on error */
std::wstring GetRootDriveOfFilePath(const std::wstring &filePath)
{
// get drive # http://msdn.microsoft.com/en-us/library/windows/desktop/bb773612(v=vs.85).aspx
int drvNbr = PathGetDriveNumber(filePath.c_str());
if (drvNbr == -1) // fn returns -1 on error
return L"";
wchar_t buff[4] = {}; // temp buffer for root
// Turn drive number into root http://msdn.microsoft.com/en-us/library/bb773567(v=vs.85)
PathBuildRoot(buff,drvNbr);
return std::wstring(buff);
}
buff
to mean the same thing as &buff[0]
for static arrays. Works for function calls, returns, etc. (see lysator.liu.se/c/c-faq/c-2.html, arrays decay into pointers in expressions except when the array is the operand of a sizeof
or &
operator which is not the case here) –
Ordain Depending on your requirements, you might also want to consider GetVolumePathName to get the mount point, which may or may not be a drive letter.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string aux;
cin >> aux;
int pos = aux.find(':', 0);
cout << aux.substr(pos-1,1) << endl;
return 0;
}
© 2022 - 2024 — McMap. All rights reserved.
PathBuildRoot
. And, if you want to initialize a static array, just use= {}
because this is the general solution and works for all types and sizes. – Ordain