Member 13089825 Ответов: 1

Как создать файл на основе cfiledialog


я хочу создать файл с помощью vc++ mfc, но его создание папки вместо файла

Что я уже пробовал:

CString fileName;
    wchar_t* p = fileName.GetBuffer(FILE_LIST_BUFFER_SIZE);
    CFileDialog dlgFile(TRUE);
    OPENFILENAME& ofn = dlgFile.GetOFN();
    ofn.lpstrFilter = L"XML\0*.xml\0All\0*.*\0";
    ofn.Flags |= OFN_CREATEPROMPT;
    ofn.lpstrFile = p;
    ofn.nMaxFile = FILE_LIST_BUFFER_SIZE;

    if (dlgFile.DoModal() == IDOK)
    {
            fileName //its creating foldername

    }

could you please correct me if im doing wrong here

мог

1 Ответов

Рейтинг:
0

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().