代码改变世界

Win32 文件(1)

2011-03-28 21:44  Clingingboy  阅读(634)  评论(0编辑  收藏  举报

 

8.1 如何获得或设置文件的属性

GetFileAttributes和SetFileAttributes方法

void CDemoDlg::OnGetFileAttributes() 
{
    //创建文件夹对话框
    CFolderDialog dlg(NULL, NULL, NULL, BIF_BROWSEINCLUDEFILES);

    if (dlg.DoModal() == IDOK)
    {
        //获得文件路径
        CString strPathName = dlg.GetPathName();

        //获得文件属性
        DWORD dwFileAttributes = ::GetFileAttributes(strPathName);

        CString strFileAttributes = _T("");

        if (dwFileAttributes & FILE_ATTRIBUTE_NORMAL)
        {
            strFileAttributes += _T("无\n");
        }
        if (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            strFileAttributes += _T("目录\n");
        }
        if (dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)
        {
            strFileAttributes += _T("存档\n");
        }
        if (dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
        {
            strFileAttributes += _T("隐藏\n");
        }
        if (dwFileAttributes & FILE_ATTRIBUTE_READONLY)
        {
            strFileAttributes += _T("只读\n");
        }
        if (dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)
        {
            strFileAttributes += _T("系统\n");
        }
        if (dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY)
        {
            strFileAttributes += _T("临时\n");
        }

        CString strText = _T("");
        strText.Format(_T("文件属性:\n%s"), strFileAttributes);
        AfxMessageBox(strText);    
    }
}

void CDemoDlg::OnSetFileAttributes() 
{
    //创建文件夹对话框
    CFolderDialog dlg(NULL, NULL, NULL, BIF_BROWSEINCLUDEFILES);

    if (dlg.DoModal() == IDOK)
    {
        //获得文件路径
        CString strPathName = dlg.GetPathName();
    
        DWORD dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE |
            FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY;

        //设置文件属性
        ::SetFileAttributes(strPathName, dwFileAttributes);

        CString strFileAttributes = _T("存档\n隐藏\n只读\n");
        
         CString strText = _T("");
         strText.Format(_T("文件属性:\n%s"), strFileAttributes);
         AfxMessageBox(strText);    
    }
}

 

8.2 如何获得文件的信息

用CFile::GetStatus静态方法获取CFileStatus结构

void CDemoDlg::OnGetFileInfo() 
{
    //创建文件对话框
    CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | 
        OFN_OVERWRITEPROMPT, _T("所有文件(*.*)|*.*||"));

    if (dlg.DoModal() == IDOK)
    {
        //获得文件路径
        CString strPathName = dlg.GetPathName();

        //获得文件信息
        CFileStatus FileStatus;
        if (CFile::GetStatus(strPathName, FileStatus))
        {
            CString strText = _T("");
            CString strInfo = _T("");

            strInfo.Format(_T("名称:%s\n"), 
                FileStatus.m_szFullName);
            strText += strInfo;

            strInfo.Format(_T("大小:%d字节\n"), 
                FileStatus.m_size);
            strText += strInfo;

            strInfo.Format(_T("创建时间:%d年%d月%d日,%02d:%02d:%02d\n"), 
                FileStatus.m_ctime.GetYear(),
                FileStatus.m_ctime.GetMonth(),
                FileStatus.m_ctime.GetDay(),
                FileStatus.m_ctime.GetHour(),
                FileStatus.m_ctime.GetMinute(),
                FileStatus.m_ctime.GetSecond());
            strText += strInfo;
            strInfo.Format(_T("修改时间:%d年%d月%d日,%02d:%02d:%02d\n"),
                FileStatus.m_mtime.GetYear(),
                FileStatus.m_mtime.GetMonth(),
                FileStatus.m_mtime.GetDay(),
                FileStatus.m_mtime.GetHour(),
                FileStatus.m_mtime.GetMinute(),
                FileStatus.m_mtime.GetSecond());
            strText += strInfo;
            strInfo.Format(_T("访问时间:%d年%d月%d日,%02d:%02d:%02d\n"),
                FileStatus.m_atime.GetYear(),
                FileStatus.m_atime.GetMonth(),
                FileStatus.m_atime.GetDay(),
                FileStatus.m_atime.GetHour(),
                FileStatus.m_atime.GetMinute(),
                FileStatus.m_atime.GetSecond());
             strText += strInfo;

            CString strFileAttributes = _T("");
            if (FileStatus.m_attribute & 0x00)
            {
                strFileAttributes += _T("无\n");
            }
            if (FileStatus.m_attribute & 0x01)
            {
                strFileAttributes += _T("只读\n");
            }
            if (FileStatus.m_attribute & 0x02)
            {
                strFileAttributes += _T("隐藏\n");
            }
            if (FileStatus.m_attribute & 0x04)
            {
                strFileAttributes += _T("系统\n");
            }
            if (FileStatus.m_attribute & 0x08)
            {
                strFileAttributes += _T("卷标\n");
            }
            if (FileStatus.m_attribute & 0x10)
            {
                strFileAttributes += _T("目录\n");
            }
            if (FileStatus.m_attribute & 0x20)
            {
                strFileAttributes += _T("存档\n");
            }
            strInfo.Format(_T("属性:%s"), strFileAttributes);
            strText += strInfo;

            AfxMessageBox(strText);
        }
    }
}

 

8.3 如何使用文件对话框

即CFileDialog的使用

void CDemoDlg::OnBrowseFile() 
{
    //文件扩展名
    CString strFilter = _T("所有文件(*.*)|*.*||");
    //创建文件对话框
    CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | 
        OFN_OVERWRITEPROMPT, strFilter);
    //对话框标题
    dlg.m_ofn.lpstrTitle = _T("浏览文件");

    if(dlg.DoModal() == IDOK)
    {
        //获得文件路径
        CString strPathName = dlg.GetPathName();

        CString strText = _T("");
        strText.Format(_T("%s"), strPathName);
        AfxMessageBox(strText);    
    }
}

8.4 如何实现文件夹对话框


MFC本身没有文件夹对话框,可借助SHBrowseForFolder函数来创建对话框

int CFolderDialog::DoModal()
{
    int nResult = 0;

    m_pidl = SHBrowseForFolder(&m_bi);

    if (m_pidl != NULL)
    {
        nResult = IDOK;
    }
    else
    {
        nResult = IDCANCEL;
    }

    return nResult;
} 

CString CFolderDialog::GetPathName()
{
    CString strPathName = _T("");
    TCHAR szPathName[MAX_PATH];

    if(::SHGetPathFromIDList(m_pidl, szPathName))
    {
        strPathName = szPathName;
    }

    return strPathName;
}

 

8.5 如何在列表框或组合框中显示文件和目录

使用DlgDirListComboBox和DlgDirList函数

void CDemoDlg::OnTest() 
{
    TCHAR szPathName[MAX_PATH] = _T(".");
    UINT nFileType = DDL_READWRITE | DDL_READONLY | DDL_HIDDEN | DDL_SYSTEM | DDL_ARCHIVE;

    //在组合框中显示文件和目录列表
    DlgDirListComboBox(szPathName, IDC_COMBO, 0, nFileType);
    ((CComboBox*)GetDlgItem(IDC_COMBO))->SetCurSel(0);

    //在列表框中显示文件和目录列表
    DlgDirList(szPathName, IDC_LIST, 0, nFileType);
}