CFileDialog多文件选择的问题

Issues with CFileDialog for multiple file selection

本文关键字:问题 选择 文件 CFileDialog      更新时间:2023-10-16

我使用以下代码通过UI检索多个文件选择:

CFileDialog fd(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER, 
    NULL, hParentWnd ? CWnd::FromHandle(hParentWnd) : NULL);
fd.m_pOFN->Flags |= OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_NODEREFERENCELINKS;
int nLnBuff = 32767;
TCHAR* pBuffFileSelect = new TCHAR[nLnBuff];
memset(pBuffFileSelect, 0, nLnBuff * sizeof(TCHAR));
fd.m_ofn.lpstrFile = pBuffFileSelect;
fd.m_ofn.nMaxFile = nLnBuff;
if(fd.DoModal() == IDOK)
{
    POSITION fileNamesPosition = fd.GetStartPosition();
    while(fileNamesPosition != NULL)
    {
        CString strSelPath = fd.GetNextPathName(fileNamesPosition);
        TRACE("path: %sn", CStringA(strSelPath));
    }  
}

delete[] pBuffFileSelect;

所以当我在我的PC上尝试时,我运行上面的方法,当"打开文件"对话框打开时,就像测试一样,我导航到我的桌面,使用Ctrl+ a快捷键选择所有文件,然后单击打开。结果,我开始得到以下路径:

The first path is a link, which is correct (it exists on my Public desktop):
"C:UsersPublicDesktopavp.lnk"
But then the second path is wrong. It gives me:
"C:UsersPublicDesktop1.txt"
when it's supposed to be (for the desktop that I picked):
"C:UsersUserNameDesktop1.txt"

然后每个连续的路径都是"Public"而不是"UserName"。

我应该指出,我在这台电脑上设置了几个用户帐户,我正在测试这个方法的是一个标准用户帐户。我正在运行此方法的应用程序没有运行提升(或具有常规用户权限),因此无论如何它都不应该访问其他用户帐户。

我哪里做错了?

检查了源,GetOpenFileName假设所有项实际上都在相同的文件路径中。这对于桌面来说是不正确的(有不同路径的项目合并到一个shell视图中),因此您将看到不良行为。

解决方案是使用Common Item对话框,它使用shell命名空间而不是文件系统路径。所有桌面项目都在一个共同的shell路径中,然后你可以使用IShellItem::GetDisplayName转换为文件系统路径。

不幸的是,MFC没有一个通用项目对话框的包装器,所以你必须自己管理。