0
static TCHAR BASED_CODE szFilter[] = _T("YUV Files|*.yuv|")
CFileDialog fileDlg(TRUE, _T("yuv"), _T("bus.yuv"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilter);
if (fileDlg.DoModal() == IDOK)
{
    CString pathName = fileDlg.GetPathName();
    CFile* pImgFile = NULL;
    pImgFile = new CFile(pathName, CFile::modeRead || CFile::typeBinary);
}

我参考了以下站点中的示例。https://msdn.microsoft.com/en-us/library/b569d0t4.aspx

static TCHAR BASED_CODE szFilter[] = _T("YUV Files|*.yuv|")
CFileDialog fileDlg(TRUE, _T("yuv"), _T("bus.yuv"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilter);
if (fileDlg.DoModal() == IDOK)
{
    CString pathName = fileDlg.GetPathName();
    CFile imgFile;
    CFileException e;
    if (!imgFile.Open(pathName, CFile::modeRead || CFile::typeBinary, &e))
    {
        TRACE(_T("File could not be opened %d\n"), e.m_cause);
    }
}

我参考以下站点中的第一个示例。https://msdn.microsoft.com/en-us/library/hwbccf8z.aspx


我在第二个代码中使用了 CFile Open 的方法。

对于上面的代码,如何打开文件?

当我使用动态分配时,它会自动打开文件吗?

imgLength = pImgFile->GetLength();
CString str;
str.Format(_T("Your SYSTEM.INI file is %I64u bytes long."), imgLength);
AfxMessageBox(str); 

我试图将此代码附加到第一个代码。

它没有任何问题,我认为变量 pImgFile 很好地指向了文件的地址。

4

1 回答 1

1

一般来说,不需要CFile在堆上创建一个。有几个构造函数CFile

CFile( );
CFile(
   CAtlTransactionManager* pTM
);
CFile(
   HANDLE hFile 
);
CFile(
   LPCTSTR lpszFileName,
   UINT nOpenFlags 
);
CFile(
   LPCTSTR lpszFileName,
   UINT nOpenFlags,
   CAtlTransactionManager* pTM
);

第四个和第五个构造函数在Open内部调用。所以他们确实打开了文件。

另一个问题是您不应该使用operator |组合||打开标志。

建议使用默认的 CFile 构造函数,然后调用Open. 请注意,如果发生错误,它不会抛出异常(FALSE而是返回),并且您不需要放置try/catch它。如果失败,您也可以选择传递给以CFileException*获取更多信息。Open

于 2015-04-25T06:49:21.047 回答