1

我是 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
4

1 回答 1

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功能。

于 2013-08-16T04:34:13.813 回答