2016-11-24 7 views
1

В настоящее время я поддерживаю старое приложение MFC и имею проблемы с открытием диалоговых окон файлов. Программа имеет несколько разных частей: пользователь выбирает файлы для загрузки, например, звук, видео и другие форматы, специфичные для программы.CFileDialog с realtive path

Открытие диалога всегда должно открываться в «конкретной» папке в зависимости от окончания файла. Предоставление пути к каталогу, содержащего «.. \», будет приниматься и диалог открывается с помощью «последнего выбранного файла».

CString fileDirectory = myHelper.getPath(); 
// fileDirectory is now "C:\coding\svn\source\MyProgram\..\..\bin\..\data\..\Audio\" 
CFileDialog FileDialog(true, _T("MP3;WAV"), _T(fileDirectory), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, _T("All music files (*.WAV;*.MP3))); 

if (FileDialog.DoModal() == IDOK) 
{ ... } 

Я использую различные классы CDialog (около 15, например, для редактирования аудиофайлов, для видеофайлов), и все они имеют аналогичный код для открытия диалоговых окон, как и выше.

Как я могу поддерживать относительные пути для CFileDialog?

+1

Как вы пришли к выводу, что 'CFileDialog' не поддерживает относительные пути? – IInspectable

ответ

0

CFileDialog поддерживает настройку начальной папки/папки по умолчанию. Вот фрагмент кода, который демонстрирует, как его использовать:

const TCHAR szFilter[] = _T("Parameter Files (*.npf)|*.npf|All Files (*.*)|*.*||"); 
    CFileDialog dlg(TRUE, _T("npf"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this); 
    CString sParametersDir(CUtility::GetParametersDir()); 
    dlg.m_ofn.lpstrInitialDir = sParametersDir.GetBuffer(_MAX_PATH);  
    if(dlg.DoModal() == IDOK) 
    { 
     m_ParametersFileEdit.SetWindowText(dlg.GetPathName()); 
    } 

    sParametersDir.ReleaseBuffer(); 

Также касается вашего кода. Нет необходимости использовать макрос _T() для CString объектов. Класс CString поддерживает UNICODE автоматически. Макрос _T() должен использоваться только для строковых литералов.

Для нормализации пути к файлу можно использовать класс CPath.

CPath path(sPath); 
path.AddBackslash(); 
path.Append(_T("Config")); 
path.Canonicalize(); 
+1

* «Нет необходимости использовать макрос' _T() 'для объектов CString'. * * На самом деле, если он вообще компилируется, вы не определили символ препроцессора UNICODE. В то время как общий с действительно старым кодом, рассмотрите возможность переключения на Unicode. – IInspectable

+0

В документации ['CFileDialog'] (https://msdn.microsoft.com/en-us/library/dk77e5e7.aspx#cfiledialog__m_ofn):« * Диалоги файлов стиля Windows Vista не поддерживают определенные элементы и флаги CFileDialog . В результате они не будут иметь никакого эффекта. * «' M_ofn.lpstrInitialDir' находится в списке полей, которые игнорируются. –

+0

Документация ['OPENFILENAME'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms646839.aspx) описывает фактическое поведение' lpstrInitialDir' в разных версиях ОС. Самое главное, что 'lpstrInitialDir' * CAN * будет проигнорирован, а вместо этого используется последний выбранный каталог пользователя. –