×

cfiledialog log

cfiledialog(请教如何用CFileDialog打开并读一个文件)

admin admin 发表于2023-01-26 02:33:58 浏览43 评论0

抢沙发发表评论

本文目录

请教如何用CFileDialog打开并读一个文件

CFileDialog cFileDlg(TRUE, _T( “txt “),(LPCTSTR)NULL,
OFN_ENABLESIZING|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_LONGNAMES|
OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST|OFN_CREATEPROMPT,
_T( “Text Files (*.txt)|*.txt|All Files (*.*)|*.*| “),this);
//获得要打开的文件
if(cFileDlg.DoModal()!=IDOK)
{
return;
}
//定义文件对象,并只读打开指定文件
CFile file(cFileDlg.GetPathName(),CFile::modeRead/*|CFile::modeWrite*/);
//准备文件大小的缓冲区
CString strTxt;
char *pBuf=strTxt.GetBuffer(file.GetLength());
//读入整个文件
file.Read(pBuf,file.GetLength());
strTxt.ReleaseBuffer(file.GetLength());
//将文件内容设置到某编辑框。
m_MyEdit.SetWindowText(strTxt);
GetDlgItem(IDC_EDIT_CONTENT)-》EnableWindow(TRUE);
m_FlagHistory = FALSE;

MFC中CFileDialog只能覆盖保存读取但是却不能直接保存是什么原因

获取文件名并使用,最好使用dlg.GetPathName() 而不是GetFileName,有绝对路径打开更安全。
没发现其它和标题提问相关的代码问题,这里,很可能是文件目录权限造成的,建议先检查目录权限或更换到管理员模式的完全权限目录尝试。

如何设置cfiledialog打开文件的浏览方式

在对话框打开之前设置:
CFileDialog
dlg;
dlg.m_ofn.lpstrInitialDir=“C:\\Windows“
dlg.DoModal();
否则只有用钩子截获对话框打开时的消息,在他显示之前改变他的墨认路径。

C++中 CFileDialog类怎么用的

CFileDialog类的应用有很多,下面介绍几个最常用的应用:

构造函数原型:
CFileDialog(BOOL bOpenFileDialog,
            LPCTSTR lpszDefExt = NULL,
            LPCTSTR lpszFileName = NULL,
            DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
            LPCTSTR lpszFilter = NULL,
            CWnd* pParentWnd = NULL
           );
参数: 
bOpenFileDialg  如果为TRUE, 则创建文件打开对话框;如果为FALSE,则构造一个File Save As(另存为)对话框。 
lpszDefExt  缺省文件扩展名,如果用户在文件名编辑框中不包含扩展名,则lpszDefExt定义的扩展名自动加到文件名后。如果为NULL,则不添加扩展名。 
lpszFileName  初始显示于文件名编辑框中的文件名,如果为NULL,则不显示初始文件名。 
dwFlags  一个或多个标志的组合,使你可定制对话框。要了解这些标志的描述,可参阅联机文档“Win32 SDK”中的OPENFILENAME结构。如果你改变m_ofn.Flags结构成员,在改变中用OR操作保持缺省行为完整。 
lpszFilter  一列字符串对,指定可以应用到文件的过滤器。如果指定过滤器,仅被选择的文件显示于文件列表框中。请参阅说明部分,了解如何使用过滤器。参数格式如:
“Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||“;文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
pParentWnd  指向文件对话框对象的父窗口或拥有者窗口。 
要使用CFileDialog,首先用构造函数构造一个对象,当创建了一个对话框后,可以设置或修改m_ofn结构中的值来初始化对话框控件的值或状态。初始化对话框控件后,调用DoModal成员函数显示对话框并使用户输入路径和文件。
重要函数:
CString CFileDialog::GetPathName( ) 得到完整的文件名(包括目录名和扩展名)如c:/test/test1.txt 
CString CFileDialog::GetFileName( ) 得到完整的文件名(包括扩展名).如test1.txt
CString CFileDialog::GetExtName( ) 得到完整的文件扩展名,如txt 
CString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名,如test1 
POSITION CFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件的位置。 
CString CFileDialog::GetNextPathName( POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。

打开大量文件:

使用CFileDialog类并设置OFN_ALLOWMULTISELECT标志时,OPENFILENAME结构体的lpstrFile成员是一个指向用户申请分配的缓冲区,里面接受所选的路径和文件名列表,这个列表的每一项由一个NULL隔开,最末以两个NULL结束。nMaxFile成员指明了缓冲区的大小,如果所选择的文件名的加起来的总长度超过了此值,则DoModal函数返回IDCANCEL,如果用户试图打开超过缓冲区大小的文件集的话,CommDlgExtendedError()将返回FNERR_BUFFERTOOSMALL,这时候,lpstrFile的前两个byte将会包含实际需要的缓冲区的字节数。
lpstrFile缓冲区字节数限制:   
    1 在Windows 95/98/Me下只能在ANSI下使用,且没有大小限制;
    2 在Windows NT 4.0及更早版本下,被限制在32k字节以内;
    3 在Windows 2000/XP版本下,MSDN中介绍说在ANSI下32k字节,Unicode下没有限制。但是,实际上两者都被限制在32k字节以内;

关于CFileDialog的问题

CFileDialog dlg(true);
dlg.m_ofn.lpstrInitialDir = “f:\\“;
if( IDOK == dlg.DoModal())
{
}

怎么用CFileDialog 选择文件夹

CString BrowseFolder(HWND hWnd, LPCTSTR lpTitle)
{
char szPath[MAX_PATH]={0};
BROWSEINFO m_bi;
m_bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
m_bi.hwndOwner = hWnd;
m_bi.pidlRoot = NULL;
m_bi.lpszTitle = lpTitle;
m_bi.lpfn = NULL;
m_bi.lParam = NULL;
m_bi.pszDisplayName = szPath;
LPITEMIDLIST pidl = ::SHBrowseForFolder( &m_bi );
if ( pidl )
{
if( !::SHGetPathFromIDList ( pidl, szPath ) ) szPath=0;
IMalloc * pMalloc = NULL;
if ( SUCCEEDED ( ::SHGetMalloc( &pMalloc ) ) ) // 取得IMalloc分配器接口
{
pMalloc-》Free( pidl ); // 释放内存
pMalloc-》Release(); // 释放接口
}
}
return szPath;
}
=============================================================
调用
void CFlorderDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString SelectPath=BrowseFolder(this-》m_hWnd,“选择目录“);
AfxMessageBox(SelectPath);
}
用户在磁盘上寻找文件时,所历经的文件夹线路叫路径。路径分为绝对路径和相对路径。
1】绝对路径:从根文件夹开始的路径,以“\”作为开始。
2】相对路径:从当前文件夹开始的路径。
DOS程序命令中:d代表盘符 p代表路径 0(零)代表文件本身,%~dp0就是文件所在的完整路径
Windows应用中文件夹路径就是当打开文件夹时地址栏显示的信息,如
H:\Downloads\Game代表的就是Game文件夹的完整路径

WTL中的CFileDialog使用

class CMyFileDialog : public CFileDialogImpl《CMyFileDialog》
{
public:
    // Construction
    CMyFileDialog ( BOOL bOpenFileDialog,
                    _U_STRINGorID szDefExt = 0U,
                    _U_STRINGorID szFileName = 0U, 
                    DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
                    _U_STRINGorID szFilter = 0U,
                    HWND hwndParent = NULL );
    // Maps
    BEGIN_MSG_MAP(CMyFileDialog)
        CHAIN_MSG_MAP(CFileDialogImpl《CMyFileDialog》)
    END_MSG_MAP()
    // Overrides
    void OnInitDone ( LPOFNOTIFY lpon );
protected:
    CString m_sDefExt, m_sFileName, m_sFilter;
    LPCTSTR PrepFilterString ( CString& sFilter );
};

//////////////////////////////////////////////////////////////////////
// CMyFileDialog
CMyFileDialog::CMyFileDialog (
    BOOL bOpenFileDialog, _U_STRINGorID szDefExt, _U_STRINGorID szFileName, 
    DWORD dwFlags, _U_STRINGorID szFilter, HWND hwndParent ) :
        CFileDialogImpl《CMyFileDialog》(bOpenFileDialog, NULL, NULL, 0,
                                       NULL, hwndParent),
        m_sDefExt(szDefExt.m_lpstr), m_sFileName(szFileName.m_lpstr),
        m_sFilter(szFilter.m_lpstr)
{
    m_ofn.lpstrDefExt = m_sDefExt;
    m_ofn.Flags |= dwFlags;
    m_ofn.lpstrFilter = PrepFilterString ( m_sFilter );
    // setup initial file name
    if ( !m_sFileName.IsEmpty() )
        lstrcpyn ( m_szFileName, m_sFileName, _MAX_PATH );
}
 
void CMyFileDialog::OnInitDone ( LPOFNOTIFY lpon )
{
    GetFileDialogWindow().CenterWindow ( lpon-》lpOFN-》hwndOwner );
}
LPCTSTR CMyFileDialog::PrepFilterString ( CString& sFilter )
{
LPTSTR psz = sFilter.GetBuffer(0);
LPCTSTR pszRet = psz;
    
    while ( ’\0’ != *psz )
        {
        if ( ’|’ == *psz )
            *psz++ = ’\0’;
        else
            psz = CharNext ( psz );
        }
    
    return pszRet;
}

使用方法:

CMyFileDialog fd (true, _T(“*.*“));

if ( IDOK == fd.DoModal(*this) )
{
USES_CONVERSION;
char* pFilePath = T2A(fd.m_szFileName);
}

怎么改变CFileDialog的默认路径

打开文件对话框创建对象的时候,CFileDialog OpenDlg(TRUE,0,0,OFN_HIDEREADONLY|OFN_FILEMUSTEXIST,(LPCTSTR)Filter,NULL);
第四个参数,是设置是否当由主程序界面的按钮打开了文件对话框并选了某个文件,返回主程序界面后默认的路径变成了选择文件的路径的,将参数加上 |OFN_NOCHANGEDIR 就不会改变你的默认路径了
获取程序路径好像可以用GetModuleFileName()这个函数

CFileDialog 如何获取文件夹路径

CFileDialog类封装了Windows常用的文件对话框。
它本身不是用于获取文件夹路径的,但是可以通过程序获取当前选择文件所在的路径,主要是依靠如下成员函数:
CString CFileDialog::GetPathName( )
该函数该得到对话框选中文件的完整的文件名,包括目录名和扩展名。
如:c:\ test\ test1.txt
那么,只要对该函数的返回值,求一下最后一个 右斜杠的位置,然后之前的东西就是文件夹,之后的就是文件名。

如何创建CFileDialog

  创建方法如下:
  CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );
  参数意义如下:
  * bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。
  * lpszDefExt 指定默认的文件扩展名。
  * lpszFileName 指定默认的文件名。
  * dwFlags 指明一些特定风格。
  * lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如:
  “Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||“;文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
  * pParentWnd 为父窗口指针。