Jochen Arndt
То CFileDialog
не будет создавать файлы или каталоги. Это диалоговое окно для выбора файлов для открытия или сохранения и возвращает выбранные имена. Вы сами создадите файл по этому пути, если он еще не существует.
Также нет необходимости передавать буфер в OPENFILENAME
структура, потому что когда не допускается множественный выбор.
Тогда просто используйте CFileDialog
GetPathName()
функция-член для получения полного имени:
CFileDialog dlgFileDlg (TRUE, "xml", fileName.GetString(),
OFN_CREATEPROMPT, L"XML\0*.xml\0All\0*.*\0", this);
if ( dlgFile.DoModal () == IDOK )
{
CString m_strPathname = dlgFile.GetPathName();
}
При использовании
OFN_ALLOWMULTISELECT
установите буфер, как это сделано в вашем коде. Тогда возвращаемая строка содержит
NULL
завершенное имя каталога, за которым следует также
NULL
завершенные имена файлов, наконец, завершенные другим
NULL
характер. Может быть, именно это вы и наблюдали.
Но вы все еще можете использовать
CFileDialog
члены, чтобы получить имена в цикле:
if ( dlgFile.DoModal () == IDOK )
{
POSITION pos = dlgFile.GetStartPosition();
while (pos)
{
CString m_strPathname = dlgFile.GetNextPathName(pos);
}
}
Member 13089825
я хочу заменить BROWSEINFO на Cfiledialog
Имя файла CString;
BROWSEINFO bi;
ZeroMemory(&bi, sizeof(bi));
TCHAR szDisplayName[MAX_PATH] = { 0 };
bi.hwndOwner = GetSafeHwnd();
bi.pidlRoot = NULL;
bi.pszDisplayName = szDisplayName;
bi.lpszTitle = _T("пожалуйста, создайте файл :");
bi.ulFlags = BIF_RETURNONLYFSDIRS;
Би.параметр lparam = нуль;
би.iImage = 0;
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
TCHAR szPathName[MAX_PATH] = { 0 };
if (NULL != pidl)
{
BOOL bRet = SHGetPathFromIDList(pidl, szPathName);
if (FALSE == bRet)
вернуть;
}
//При нажатии кнопки Отмена имя каталога не изменяется
if (szPathName[0] != '\0')
{
имя файла
}
Jochen Arndt
"я хочу заменить BROWSEINFO на Cfiledialog" противоречит вашему вопросу "я хочу создать файл с помощью vc++ mfc, но его создание папки вместо файла".
Если вы действительно хотите выбрать папку:
SHBrowseForFolder - как следует из названия - предназначен для выбора папок (каталогов), а CFileDialog-для выбора имен файлов.
Хотя вы можете злоупотреблять CFileDialog для выбора папок, просто используя часть каталога, я бы не стал этого делать, потому что он не предназначен для этого и может запутать пользователей.
Member 13089825
"Если вы действительно хотите выбрать папку:
SHBrowseForFolder - как следует из названия - предназначен для выбора папок (каталогов), а CFileDialog-для выбора имен файлов."
я хочу создать пример файла test .xml внутри какой-то папки,будет ли это возможно с помощью селектора файлов
Jochen Arndt
Это возможно (и является выбором файла).
Все, что вам нужно, - это полный путь к имени файла, как это было в моем первом примере кода (dlgFile.GetPathName()). Пас, что для любой функции или класса, который создает файл, как поведение _wfopen(), wfstream, или то cfile().