欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

vc文件操作汇总—支持wince

程序员文章站 2022-04-29 16:44:01
一、判断文件及文件夹是否存在 二、创建及删除目录 三、查看指定根目录下目录个数 四、文件记录操作 五、CCeFileFind — wince 由于wince中不支持CFileFind,在此提供网上查找的CCeFileFind类,经过实践证明可用。 ......

一、判断文件及文件夹是否存在

// 判断文件是否存在
bool isfileexist(const cstring& csfile)
{
    dword dwattrib = getfileattributes(csfile);
    return invalid_file_attributes != dwattrib && 0 == (dwattrib & file_attribute_directory);
}
// 判断文件夹是否存在
bool isdirexist(const cstring & csdir)
{
    dword dwattrib = getfileattributes(csdir);
    return invalid_file_attributes != dwattrib && 0 != (dwattrib & file_attribute_directory);
}
// 判断文件或文件夹是否存在
bool ispathexist(const cstring & cspath)
{
    dword dwattrib = getfileattributes(cspath);
    return invalid_file_attributes != dwattrib;
}

// 判断文件或文件夹是否存在
bool ispathexistex(const cstring & cspath)
{
    win32_file_attribute_data attrs = { 0 };
    return 0 != getfileattributesex(cspath, getfileexinfostandard, &attrs);
}

 

二、创建及删除目录

// 创建目录
bool createfolder(cstring strpath) { security_attributes attrib; attrib.binherithandle = false; attrib.lpsecuritydescriptor = null; attrib.nlength = sizeof(security_attributes); return ::createdirectory(strpath, &attrib); //return ::createdirectory(strpath,null); }
// 删除目录及子目录 bool deletedirectory(cstring dirname) { cstring pubpath; pubpath = dirname; cfilefind tempfind; dirname += "\\*.*"; bool isfinded = (bool)tempfind.findfile(dirname); while(isfinded) { isfinded = (bool)tempfind.findnextfile(); if(!tempfind.isdots()) { cstring strdirname; strdirname += pubpath; strdirname += "\\"; strdirname += tempfind.getfilename(); if(tempfind.isdirectory()) { deletedirectory(strdirname); } else { setfileattributes(strdirname, file_attribute_normal); //去掉文件的系统和隐藏属性 deletefile(strdirname); } } } tempfind.close(); if(!removedirectory(pubpath)) { return false ; } return true; }

 

三、查看指定根目录下目录个数

// 获取目录数
int getdirnum(cstring strpath) { int ndirnum = 0; cfilefind tempfind; bool bfound; bfound = tempfind.findfile(strpath + _t("\\*.*")); while (bfound) { bfound = tempfind.findnextfile(); if(!tempfind.isdots()) { if(tempfind.isdirectory())  // 判断是否为文件夹 ndirnum++; } } tempfind.close(); return ndirnum; }

 

四、文件记录操作

// 文件末尾写入记录 (以时间为例)
void writerecord(time_t tm, cstring strrecordfilepath) { ctime ctm(tm); cstring strtime = ctm.format(_t("%y-%m-%d %h_%m_%s")); cstdiofile stdiofile; if (stdiofile.open(strrecordfilepath, cfile::modewrite)) { stdiofile.seektoend(); stdiofile.writestring(strtime); stdiofile.close(); } }
// 读取第一条记录 cstring readrecord(cstring strrecordfilepath) { cstring strfirstrecord = _t(""); cstdiofile stdiofile; if (stdiofile.open(strrecordfilepath, cfile::modereadwrite)) { stdiofile.seektobegin(); stdiofile.readstring(strfirstrecord); stdiofile.close(); } return strfirstrecord; }
// 删除第一条记录 void deleterecord(cstring strrecordfilepath) { vector<cstring> vecstr; cstring strtemp; cstdiofile stdiofile; if (stdiofile.open(strrecordfilepath, cfile::modenotruncate|cfile::moderead)) { stdiofile.readstring(strtemp); while (stdiofile.readstring(strtemp)) { vecstr.push_back(strtemp); } stdiofile.close(); stdiofile.open(strrecordfilepath, cfile::modecreate|cfile::modewrite); for (int i = 0; i < (int)vecstr.size(); i++) { stdiofile.writestring(vecstr[i]); } stdiofile.close(); } }

 

五、ccefilefind — wince

  由于wince中不支持cfilefind,在此提供网上查找的ccefilefind类,经过实践证明可用。

//================================头文件===================================
#if !defined _cefilefind_h_
#define _cefilefind_h_
// cefilefind.h : header file
#include <afxwin.h>
/////////////////////////////////////////////////////////////////////////////
// ccefilefind window
class ccefilefind : public cwnd
{
    // construction
public:
    ccefilefind( );
public:
    // operations
    void close();
    virtual bool findnextfile( );
    virtual bool findfile( lpctstr pstrname = null);
public:
    // attributes
    //gets the length of the found file, in bytes.
    dword getlength() const;
    //gets the name, including the extension, of the found file
    cstring getfilename() const;
    //gets the whole path of the found file.
    cstring getfilepath() const;
    //gets the whole path of the found file.
    cstring getroot() const;
    // to get the time the specified file was created
    virtual bool getcreationtime( filetime* pfiletime ) const;
    virtual bool getcreationtime( ctime& reftime ) const;
    //gets the time that the file was last accessed.
    virtual bool getlastaccesstime( ctime& reftime ) const;
    virtual bool getlastaccesstime( filetime* pfiletime ) const;
    //gets the time the file was last changed and saved.
    virtual bool getlastwritetime( filetime* pfiletime ) const;
    virtual bool getlastwritetime( ctime& reftime ) const;
    //indicates the desired file attributes of the file to be found.
    virtual bool matchesmask( dword dwmask ) const;
    //determines if the name of the found file has the name "." or "..",
    //indicating that is actually a directory.
    virtual bool isdots( ) const;
    //determines if the found file is read-only.
    bool isreadonly( ) const;
    //determines if the found file is a directory.
    bool isdirectory( ) const;
    //determines if the found file is compressed.
    bool iscompressed( ) const;
    //determines if the found file is a system file.
    bool issystem( ) const;
    //determines if the found file is hidden.
    bool ishidden( ) const;
    //determines if the found file is temporary.
    bool istemporary( ) const;
    //determines if the found file is normal (in other words, has no other attributes).
    bool isnormal( ) const;
    //determines if the found file is archived.
    bool isarchived( ) const;
    // implementation
public:
    virtual ~ccefilefind();
private:
    lpwin32_find_data m_pfiledata;
    lpwin32_find_data m_pnextdata;
    cstring m_csroot;
    handle m_hfilehandle;
    char m_chdirseparator;
    void assertdonenext() const;
};
#endif // !defined _cefilefind_h_

 

//====================================源文件===============================
// cefilefind.cpp : implementation file
//
#include "stdafx.h"
#include "cefilefind.h"
#ifdef _debug
#define new debug_new
#undef this_file
static char this_file[] = __file__;
#endif
#define delete_pointer(ptr) if( ptr != null ) \
{ \
    delete ptr; \
    ptr = null; \
}
#define dir_seperator '\\'
/////////////////////////////////////////////////////////////////////////////
// ccefilefind
ccefilefind::ccefilefind()
:m_hfilehandle(null), // initialize to null
m_pfiledata(null)
{
}
ccefilefind::~ccefilefind()
{
    close();
}
// operations
bool ccefilefind::findfile(lpctstr pstrname)
{
    //close();
    // if null , wild card search
    if( null == pstrname )
    {
        m_csroot = dir_seperator;
        pstrname = _t("\\*.*");
    }
    else
    {
        m_csroot = pstrname;
        int npos = m_csroot.reversefind( '\\' );
        if( npos == 0 )
            m_csroot = '\\';
        else
            m_csroot = m_csroot.left( npos );
    }
    m_pnextdata = new win32_find_data;
    // search for file
    m_hfilehandle = findfirstfile( pstrname, m_pnextdata );
    if ( m_hfilehandle == invalid_handle_value )
    {
        close();
        return false;
    }
    // file was found
    return true;
}
bool ccefilefind::findnextfile()
{
    assert(m_hfilehandle != null);
    if (m_hfilehandle == null)
        return false;
    if (m_pfiledata == null)
        m_pfiledata = new win32_find_data;
    assertdonenext();
    lpwin32_find_data ptemp = m_pfiledata;
    m_pfiledata = m_pnextdata;
    m_pnextdata = ptemp;
    return ::findnextfile(m_hfilehandle, m_pnextdata);
}
void ccefilefind::close()
{
    delete_pointer( m_pfiledata );
    delete_pointer( m_pnextdata );
    if( m_hfilehandle!= null && m_hfilehandle !=
        invalid_handle_value )
    {
        ::findclose( m_hfilehandle );
        m_hfilehandle = null;
    }
}
bool ccefilefind::matchesmask(dword dwmask) const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    if ( m_pfiledata != null)
        return (!!(m_pfiledata->dwfileattributes & dwmask) );
    else
        return false;
}
cstring ccefilefind::getroot() const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    if (m_pfiledata != null)
        return m_csroot;
    else
        return cstring("");
}
bool ccefilefind::getlastaccesstime(filetime* ptimestamp) const
{
    assert(m_hfilehandle != null);
    assert(ptimestamp != null);
    assertdonenext();
    if (m_pfiledata != null && ptimestamp != null)
    {
        *ptimestamp = m_pfiledata -> ftlastaccesstime;
        return true;
    }
    else
        return false;
}
bool ccefilefind::getlastwritetime(filetime* ptimestamp) const
{
    assert(m_hfilehandle != null);
    assert(ptimestamp != null);
    assertdonenext();
    if (m_pfiledata != null && ptimestamp != null)
    {
        *ptimestamp = m_pfiledata -> ftlastwritetime;
        return true;
    }
    else
        return false;
}
bool ccefilefind::getcreationtime(filetime* ptimestamp) const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    if (m_pfiledata != null && ptimestamp != null)
    {
        *ptimestamp = m_pfiledata -> ftcreationtime;
        return true;
    }
    else
        return false;
}
bool ccefilefind::getlastaccesstime(ctime& reftime) const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    if (m_pfiledata != null)
    {
        reftime = ctime( m_pfiledata -> ftlastaccesstime );
        return true;
    }
    else
        return false;
}
bool ccefilefind::getlastwritetime(ctime& reftime) const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    if (m_pfiledata != null)
    {
        reftime = ctime( m_pfiledata -> ftlastwritetime );
        return true;
    }
    else
        return false;
}
bool ccefilefind::getcreationtime(ctime& reftime) const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    if (m_pfiledata != null)
    {
        reftime = ctime( m_pfiledata -> ftcreationtime );
        return true;
    }
    else
        return false;
}
bool ccefilefind::isdots() const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    // return true if the file name is "." or ".." and
    // the file is a directory
    bool bresult = false;
    if (m_pfiledata != null && isdirectory())
    {
        lpwin32_find_data pfinddata = m_pfiledata;
        if (pfinddata->cfilename[0] == '.')
        {
            if (pfinddata->cfilename[1] == '\0' ||
                (pfinddata->cfilename[1] == '.' &&
                pfinddata->cfilename[2] == '\0'))
            {
                bresult = true;
            }
        }
    }
    return bresult;
}
bool ccefilefind::isarchived( ) const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    if (m_pfiledata != null)
    {
        if( m_pfiledata -> dwfileattributes == file_attribute_archive )
            return true;
        else
            return false;
    }
    return false;
}
bool ccefilefind::iscompressed() const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    if (m_pfiledata != null)
    {
        if( m_pfiledata -> dwfileattributes ==
            file_attribute_compressed )
            return true;
        else
            return false;
    }
    return false;
}
bool ccefilefind::isdirectory() const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    if (m_pfiledata != null)
    {
        if( m_pfiledata -> dwfileattributes & file_attribute_directory )
            return true;
        else
            return false;
    }
    return false;
}
bool ccefilefind::ishidden() const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    if (m_pfiledata != null)
    {
        if( m_pfiledata -> dwfileattributes & file_attribute_hidden )
            return true;
        else
            return false;
    }
    return false;
}
bool ccefilefind::isnormal() const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    if (m_pfiledata != null)
    {
        if( m_pfiledata -> dwfileattributes & file_attribute_normal )
            return true;
        else
            return false;
    }
    return false;
}
bool ccefilefind::isreadonly() const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    if (m_pfiledata != null)
    {
        if( m_pfiledata -> dwfileattributes & file_attribute_readonly )
            return true;
        else
            return false;
    }
    return false;
}
bool ccefilefind::issystem() const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    if (m_pfiledata != null)
    {
        if( m_pfiledata -> dwfileattributes & file_attribute_system )
            return true;
        else
            return false;
    }
    return false;
}
bool ccefilefind::istemporary() const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    if (m_pfiledata != null)
    {
        if( m_pfiledata -> dwfileattributes & file_attribute_temporary )
            return true;
        else
            return false;
    }
    return false;
}
cstring ccefilefind::getfilepath() const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    cstring csresult = m_csroot;
    if (csresult[csresult.getlength()-1] != dir_seperator )
        csresult += dir_seperator;
    csresult += getfilename();
    return csresult;
}
cstring ccefilefind::getfilename() const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    cstring ret;
    if (m_pfiledata != null)
        ret = m_pfiledata->cfilename;
    return ret;
}
dword ccefilefind::getlength() const
{
    assert(m_hfilehandle != null);
    assertdonenext();
    if (m_pfiledata != null)
        return m_pfiledata -> nfilesizelow;
    else
        return 0;
}
void ccefilefind::assertdonenext() const
{
    // if you trip the assert in the else side, you've called
    // a get() function without having done at least one
    // findnextfile() call
    if (m_hfilehandle == null)
        assert( m_pfiledata == null && m_pnextdata == null);
    else
        assert( m_pfiledata != null && m_pnextdata != null);
}