【问题标题】:Why CFileDialog::GetNextPathName doesn't work when the file path is long?为什么文件路径长时 CFileDialog::GetNextPathName 不起作用?
【发布时间】:2013-01-31 22:43:57
【问题描述】:

使用CFileDialog 类,我选择放置在一个路径较长的目录中的多个文件。只选择一两个文件就可以了;但是当我同时选择三个文件时,它只返回第三个文件路径的一部分。 (看起来可能限制为 512 个字符)我该如何解决这个问题?

【问题讨论】:

  • 和Window的MAX_PATH有关系吗?
  • 它与 MFC 默认使用大小为 _MAX_PATH 的缓冲区有关。它可以被覆盖。

标签: c++ winapi mfc path cfiledialog


【解决方案1】:

MFC 使用大小为_MAX_PATH 的默认缓冲区,这就是您看到这种行为的原因。查看dlgfile.cpp 以了解CFileDialog::CFileDialog 的实现,您将看到m_ofn.lpstrFilem_ofn.nMaxFile 正在设置。

如果您愿意,可以指定更大的缓冲区。在调用DoModal 之前,您可以访问CFileDialog::m_pOFN 成员以获取指向CFileDialog 将使用并直接更新它的OPENFILENAME 的指针,或者调用CFileDialog::GetOFN 以获取对结构的引用并更新它。

无论哪种方式,您都会发现这很有帮助:http://msdn.microsoft.com/en-US/library/ms646839(v=vs.80).aspx

【讨论】:

  • 如果您要解决这个问题,您可能还想考虑使用Common Item DialogsGetOpenFileName API 在 Vista 版本中已被弃用,但仍支持旧版应用程序。
【解决方案2】:

假设您的代码如下所示:

CFileDialog dialog(...);
dialog.DoModal();

确定您希望支持的最大文件数,例如:

#define MAX_FILE_NAMES 256

在调用DoModal之前添加这个:

CString data;
dialog.m_pOFN->nMaxFile = (MAX_FILE_NAMES*(MAX_PATH+1))+1;
dialog.m_pOFN->lpstrFile = data.GetBuffer((MAX_FILE_NAMES*(MAX_PATH+1))+1);

调用DoModal后添加:

data.ReleaseBuffer();

【讨论】:

    猜你喜欢
    • 2021-08-14
    • 2021-08-09
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多