注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

驱动器挂载点操作函数  

2014-07-04 16:02:31|  分类: Windows编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

驱动器挂载点,又可以称作卷挂载点,或者装入点。挂载点实际上是操作系统或者用户设置的,用来进入一个逻辑驱动器或者卷的入口。在设置了卷的挂载点后,用户或者应用程序可以使用卷标或者指定的挂载点来进入卷。Windows操作系统中的创建挂载点操作如下:

右键“我的电脑”-“管理”,选择“磁盘管理”,然后右键单击一个磁盘,例如“E:\”盘,选择“更改驱动器号和路径”:

1

然后点击“添加”为E盘添加一个挂载点,例如选择文件夹“C:\MPE”。

2

确定之后,到C盘根目录下可以看到一个名为MPE而使用盘符图标的文件夹,打开之后直接进入到E盘。

3

Windows编程中也提供了一些函数,用于查询、编辑、删除挂载点等操作。

1. 挂载点查询

查询挂载点有三个函数,分别是FindFirstVolumeMountPoint、FindNextVolumeMountPoint和FindVolumeMountPointClose,这三个函数和FindFirstVolume、FindNextVolume以及FindVolumeClose这一组函数使用类似。FindFirstVolumeMountPoint的第一个参数接受一个作为卷名的字符串,第二个参数则是传出挂载点名称的字符串,第三个参数指明挂载点名称字符串的长度。

下面的代码用于获取E盘的挂载点:

#include <stdlib.h>
#include <stdio.h>
#include "windows.h"

void ListMountPointOfVolume(const char* szVolumeName)
{
    char szVolumeMountPoint[MAX_PATH]="";
    HANDLE hMount=FindFirstVolumeMountPointA(szVolumeName,szVolumeMountPoint,MAX_PATH);
    if(hMount==INVALID_HANDLE_VALUE)
        return;
    printf("Mount Point of '%s' is :\"%s\"\n",szVolumeName,szVolumeMountPoint);
    while(FindNextVolumeMountPointA(hMount,szVolumeMountPoint,MAX_PATH))
        printf("Mount Point of '%s' is :\"%s\"\n",szVolumeName,szVolumeMountPoint);
    FindVolumeMountPointClose(hMount);    
}

int main()
{
    char szRootPathName[MAX_PATH]="E:\\";
    char szVolumeName[MAX_PATH]="";
    HANDLE hVolume=FindFirstVolumeA(szRootPathName,MAX_PATH);
    if(hVolume==INVALID_HANDLE_VALUE)
    {
        printf("Failed to get Handle of in FindFirstVolume\n");
        return -1;
    }
    printf("%s\n",szVolumeName);
    ListMountPointOfVolume(szVolumeName);
    while (FindNextVolumeA(hVolume,szVolumeName,MAX_PATH))
        ListMountPointOfVolume(szVolumeName);
    FindVolumeClose(hVolume);
    return 0;
}
2. 根据挂载点获取卷名称
一个卷可以有多个挂载点,但是每个挂载点都只对应了一个卷,是用函数GetVolumeNameForVolumeMountPoint可以根据挂载点名称,获取卷名称。
接前面已经创建好的挂载点,我们查询一下C:\MPE文件夹挂载的卷名称,代码如下:
char szMountPointName[MAX_PATH]="C:\\MPE\\";
char szVolumeName[MAX_PATH]="";
if(GetVolumeNameForVolumeMountPointA(szMountPointName,szVolumeName,MAX_PATH))
    printf("%s\n",szVolumeName);
注意,GetVolumeNameForVolumeMountPoint的第一个参数,必须使用’\\’结尾,否则不能正确获取对应的卷名称。
3. 设置挂载点
函数SetVolumeMountPoint用于创建一个挂载点,下面是该函数的一个使用示例,该示例将F盘挂载到了C:\MPF\目录,在运行前,务必确保MPF文件夹存在,且为空。
#include <stdlib.h>
#include <stdio.h>
#include "windows.h"

/*
根据所提供的磁盘根目录名称,获取其卷名称
szRootPathName:根目录名称,例如"F:\\",注意要大写
szVolumeName:带出的参数,如果操作成功,则szVolumeName就是指定磁盘卷的名称,一般形式为:\\?\volume{41b161a7-c053-11de-bf01-806e6f6e6963}\ 
VolumeNameSize:参数szVolumeName的长度,不包括'\0'
返回值:
检索成功,则返回TRUE,否则为FALSE
*/
BOOL GetVolumeNameByRootPathName(const char* szRootPathName,char* szVolumeName,PDWORD VolumeNameSize)
{
    char szVolumePathName[MAX_PATH]="";
    DWORD dwLen;
    HANDLE hVolName=FindFirstVolumeA(szVolumeName,MAX_PATH);
    if(hVolName==INVALID_HANDLE_VALUE)
        return -1;
    GetVolumePathNamesForVolumeNameA(szVolumeName,szVolumePathName,MAX_PATH,&dwLen);
    if(strcmp(szVolumePathName,szRootPathName)==0)//match
    {
        *VolumeNameSize=strlen(szVolumeName);
        return TRUE;
    }
    while (FindNextVolumeA(hVolName,szVolumeName,MAX_PATH))
    {
        GetVolumePathNamesForVolumeNameA(szVolumeName,szVolumePathName,MAX_PATH,&dwLen);
        if(strcmp(szVolumePathName,szRootPathName)==0)//match
        {
            *VolumeNameSize=strlen(szVolumeName);
            return TRUE;
        }
    }
    FindVolumeClose(hVolName);
    //none match
    *VolumeNameSize=0;
    return FALSE;
}

int main()
{
    char szVolumeName[MAX_PATH]="";
    DWORD dwLen;
    if(GetVolumeNameByRootPathName("F:\\",szVolumeName,&dwLen))
    {
        if(SetVolumeMountPointA("C:\\MPF\\",szVolumeName))
            printf("^_^\n");
        else
            printf("T_T\n");
    }
    return 0;
}
注意在使用SetVolumeMountPoint的时候,挂载点目录必须存在,而且必须为空目录,否则程序会运行失败,如果挂载成功,则该目录变为挂载点,打开则直接进入该磁盘。
实际上,上面的自定义函数GetVolumeNameByRootPathName,在Windows中也提供了,该函数为GetVolumeNameForVolumeMountPoint,上面的代码可以变为如下:
#include <stdlib.h>
#include <stdio.h>
#include "windows.h"

int main()
{
    char szVolName[MAX_PATH]="";
    if(GetVolumeNameForVolumeMountPointA("f:\\",szVolName,MAX_PATH))
    {
        printf("%s\n",szVolName);
        if(SetVolumeMountPointA("C:\\MPF\\",szVolName))
            printf("^_^\n");
        else
            printf("T_T\n");
    }
    return 0;
}

4. 删除挂载点

函数DeleteVolumeMountPoint删除挂载点,该函数接收一个代表挂载点目录的字符串。测试代码(ANSI版本):

#include <stdlib.h>
#include <stdio.h>
#include "windows.h"

int main()
{
    if(DeleteVolumeMountPointA("C:\\MPF\\"))
        printf("^_^\n");
    else
        printf("T_T\n");
    return 0;
}
注意,删除挂载点之后,原文件夹变为原来的空文件夹。
如果我们将该函数的参数变为一个根目录的地址,例如“F:\\”,那么函数操作的结果又是怎么样的呢?
测试可以发现,F盘被隐藏了,而且在Explorer.exe的地址栏中输入F:\也打不开,因为F盘的挂载点被删除了,如何恢复呢?只要和本文开头的添加挂载点进行同样的操作,当打开如下窗口时,选择“分配以下驱动器号”即可恢复。
CX_0704_155808
这种方式可以骗骗电脑小白,另外,还得说明的是,挂载的磁盘必须是NTFS文件系统的,不过挂载点不必是NTFS系统。
  评论这张
 
阅读(794)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016