从“打开文件”对话框中获取文件夹

时间:2013-08-16 04:31:07

标签: c++ winapi

我是c ++的新手,我无法弄清楚从打开的文件对话框中获取所选文件的目录是多么简单。我正在尝试使用标准函数,在我的例子中它是GetFullPathName。 这就是我要做的事情:

OPENFILENAME ofn;       // common dialog box structure
char szFile[260];       // buffer for file name
HANDLE hf;              // file handle
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.lpstrFile = szFile;
// Set lpstrFile[0] to '\0' so that GetOpenFileName does not 
// use the contents of szFile to initialize itself.
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
//ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

// Display the Open dialog box. 

if (GetOpenFileName(&ofn) == TRUE)
    hf = CreateFile(ofn.lpstrFile,
    GENERIC_READ,
    0,
    (LPSECURITY_ATTRIBUTES) NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    (HANDLE) NULL);


char buffer[MAX_PATH];
char *buffer2[MAX_PATH];
GetFullPathName(ofn.lpstrFile,
    ofn.nMaxFile,
    buffer,
    buffer2);

//PathRemoveFileSpec(ofn.lpstrFile);
MessageBox(hWnd, buffer, "Tutorial", 0); // and show the path

1 个答案:

答案 0 :(得分:1)

GetOpenFileName()返回时,所选文件将存储在您通过lpstrFile成员提供的缓冲区中。这是文件的完整路径(例如 C:\ Path \ To \ File.txt )。

要获取文件所在的文件夹,您需要做的就是剥离最后一个组件。您可以通过向后搜索字符串以获取最后一个反斜杠字符,或使用其中一个实用程序函数为您执行此操作:

char chFolderPath[MAX_PATH];
StringCchCopy(chFolderPath, MAX_PATH, ofn.lpstrFile);
PathRemoveFileSpec(chFolderPath);
// chFolderPath now contains "C:\Path\To"

请注意,您需要#include <shlwapi.h>并与shlwapi.lib关联才能使用PathRemoveFileSpec功能。