美文网首页
4.16 通过文件句柄获取文件路径

4.16 通过文件句柄获取文件路径

作者: f675b1a02698 | 来源:发表于2017-09-14 16:15 被阅读0次

    效果

    源码

    #include

    #include

    #include

    #include

    #include

    #define BUFSIZE 512

    //从文件句柄获取文件路径

    BOOL GetFileNameFromHandle(HANDLE hFile){

    TCHAR pszFileName[MAX_PATH];

    HANDLE hFileMap;

    PVOID pMem;

    //蝴蝶文件大小

    DWORD dwFileSizeHigh = 0;

    DWORD dwFileSizeLow = GetFileSize(hFile, &dwFileSizeHigh);

    if (dwFileSizeLow == 0 && dwFileSizeHigh == 0){

    printf("不能映射文件大小为0的文件\n");

    return FALSE;

    }

    //创建Mapping对象

    hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 1, NULL);

    if (!hFileMap){

    printf("创建文件映射对象失败: %d\n", GetLastError());

    return FALSE;

    }

    pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);

    if (!pMem){

    printf("文件映射视图错误: %d\n", GetLastError());

    return FALSE;

    }

    //从Mapping对象获得文件名

    if (GetMappedFileName(GetCurrentProcess(), pMem, pszFileName, MAX_PATH) == 0){

    printf("获得映射文件名错误: %d\n", GetLastError());

    return FALSE;

    }

    //将设备名转换为路径

    TCHAR szTemp[BUFSIZE] = { 0 };

    if (GetLogicalDriveStrings(BUFSIZE - 1, szTemp) == 0){

    printf("GetLogicalDriveStrings函数出错: %d\n", GetLastError());

    return FALSE;

    }

    TCHAR szName[MAX_PATH];

    TCHAR szDrive[3] = { 0 };

    BOOL bFound = FALSE;

    PTCHAR p = szTemp;

    do{

    CopyMemory(szDrive, p, 2 * sizeof(TCHAR));

    //通过路径查找设备名

    if (!QueryDosDevice(szDrive, szName, BUFSIZE)){

    printf("通过路径查找设备名出错: %d\n", GetLastError());

    return FALSE;

    }

    UINT uNameLen = lstrlen(szName);

    if (uNameLen< MAX_PATH){

    //比较驱动器设备名与文件设备名是否匹配

    bFound = strncmp(pszFileName, szName, uNameLen) == 0;

    if (bFound){

    //如果匹配,说明找到,构造路径

    TCHAR szTempFile[MAX_PATH];

    wsprintf(szTempFile, TEXT("%s%s"), szDrive, pszFileName + uNameLen);

    lstrcpy(pszFileName, szTempFile);

    }

    }

    while (*p++);//循环到下一个NULL

    } while (!bFound && *p);

    UnmapViewOfFile(pMem);

    CloseHandle(hFileMap);

    printf("文件路径为: %s\n", pszFileName);

    return TRUE;

    }

    int main(int argc, PCHAR argv[]){

    //查找第一个目录中第一个txt文件

    HANDLE hFile;

    HANDLE hFind;

    WIN32_FIND_DATA wfd;

    hFind = FindFirstFile("*.txt", &wfd);

    if (hFind == INVALID_HANDLE_VALUE){

    printf("没有找到文件\n");

    return 1;

    }

    //CloseHandle(hFind);

    printf("找到 %s 文件路径\n", wfd.cFileName);

    hFile = CreateFile(wfd.cFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    if (hFile == INVALID_HANDLE_VALUE){

    printf("创建文件错误: %d\n", GetLastError());

    } else{

    GetFileNameFromHandle(hFile);

    }

    CloseHandle(hFile);

    getchar();

    return 0;

    }

    相关文章

      网友评论

          本文标题:4.16 通过文件句柄获取文件路径

          本文链接:https://www.haomeiwen.com/subject/zsgqsxtx.html