VC 根据文件路径获取设备路径及设备名

项目中间遇到一个问题,需要判断文件在哪个设备上,翻了一遍MSDN,找到了下面的解决方案。

有人可能会觉得_splitPath就可以了,这是不行的,因为_splitPath不能正确获取挂载到目录的设备。


解决思路方法是GetVolumePathName获取设备根路径,然后调用GetVolumeNameForVolumeMountPoint获取设备的名称。之所以要获取设备的名称是因为:CreatFile的输入路径必须是设备名,对于有盘符的设备根路径(如C:),设备根路径加上设备前缀就是设备别名(如\\?\C:),但是对于挂载到文件夹的设备,设备根路径加上设备前缀并不是设备别名。


示例代码如下:

wstring GetVolumePathByFile(LPCWSTR path){
    WCHAR volume_path[MAX_PATH+1]={0};
    if(!GetVolumePathNameW(path, volume_path, MAX_PATH+1)){
        DWORD error = GetLastError();
        MYDEBUGTRACE(L"GetVolumePathNameW for %s failed(%d): %s"
            , path, error, MYERROR2STRING(error).GetBuffer());
    }else{
        volume_path[wcslen(volume_path)-1] = L'\0';
        MYDEBUGTRACE(L"file %s volume path is %s", path, volume_path);
        return wstring(volume_path);
    }
    return wstring();    
}


wstring GetVolumeNameByFile(LPCWSTR in_path){
    wstring volume_path = GetVolumePathByFile(in_path);
    if(volume_path.empty()){
        MYDEBUGTRACE(L"GetVolumeNameByFile failed: GetVolumePathByFile failed\n");
        return wstring();
    }
    volume_path += L"\\";


    WCHAR volume_name[MAX_PATH+1];
    if(!GetVolumeNameForVolumeMountPointW(volume_path.c_str(), volume_name, MAX_PATH+1)){
        DWORD error = GetLastError();
        MYDEBUGTRACE(L"GetVolumeNameForVolumeMountPoint failed, path: %s, code(%d): %s"
            ,volume_path.c_str(), error, MYERROR2STRING(error).GetBuffer());
        return wstring();
    }else{
        MYDEBUGTRACE(L"path %s volume name is %s",in_path, volume_name);
        return wstring(volume_name);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值