利用WINDOWS API函数操作文件(CreateFile、ReadFile 、MultiByteToWideChar)

//利用API操作文件
void CFileOperateDlg::OnBnClickedButtonFile()
{
    //-------------------------------------------------------------------------

    // 变量声明
    CString strFilePath( TEXT( "e://FX_AppleTalkTool.rc" ) );//jobbt.html//e://BuildJobEdit.txt
    DWORD    dwAttribute;
    HANDLE  hFile;
    DWORD    dwFileSize;
    BOOL    bReadFile;
    LPBYTE    pSaveFileData;
    DWORD    dwToReadCharNums;
    DWORD    dwReadCharNums;

    int        iWideBufferSize;
    LPWSTR    pWideFileData;

    // 变量初始化
    hFile            = INVALID_HANDLE_VALUE;
    pSaveFileData    = NULL;
    pWideFileData    = NULL;
    bReadFile        = FALSE;

    // 以下各种操作均对返回值进行判断
    //-----------------------------------------------------------------------------

    // 得到文件属性
    dwAttribute = GetFileAttributes( strFilePath );

    // 如果获取失败或者是文件夹就不处理
    if( (-1 == dwAttribute) || (0 != (dwAttribute & FILE_ATTRIBUTE_DIRECTORY)) ){
        goto PROC_END;
    }

    // 打开文件
    hFile = CreateFile( strFilePath,      //要打开的文件的名字
                        GENERIC_READ,    //应用程序对文件进行何种操作
                        0,                        //零表示不共享,其他进程不可以同时操作此文件
                        NULL,                   //文件安全属性,一般置为NULL
                        OPEN_ALWAYS,      //文件存在就读取,不存在就创建一个
                        FILE_ATTRIBUTE_NORMAL,    //文件属性默认,隐藏还是只读
                        NULL                                //不复制扩展名,故设为NULL
                      );

    if( INVALID_HANDLE_VALUE == hFile ){

        goto PROC_END;

    } else {

        // 得到文件大小
        dwFileSize = GetFileSize( hFile,NULL);

        if( -1 == dwFileSize ){

            goto PROC_END;
        } else if( 0 == dwFileSize ){

            goto PROC_END;
        }
        
        // 初始化ReadFile的各个参数,保存文件数据的缓冲区pSaveFileData,预读取文件字符数dwToReadCharNums
        dwToReadCharNums = dwFileSize;

        // 分配缓冲区大小
        try{
            pSaveFileData = new BYTE[ dwFileSize + sizeof(char) ];// 对于LP指针类型的数据,要有两步操作,分别是初始化与分配空间
            memset( pSaveFileData , 0,  ( dwFileSize + sizeof(char)) *sizeof(char) );// 清空pSaveFileData内存

        }catch( CException *){

            pSaveFileData = NULL;
            goto PROC_END;

        }

        // 读取文件,读取出多字节字符串
        bReadFile = ReadFile(    hFile,            //文件句柄
                                pSaveFileData ,    //保存文件内容的缓冲区
                                dwToReadCharNums,//预读取的字符数
                                &dwReadCharNums,//实际读取的字符数
                                NULL                  //一般为空
                            );

        if( FALSE == bReadFile ){
            goto PROC_END;
        }


        //---------------------------------------------------------------------
        // 多字节字符转为unicode(宽字节字符)pSaveFileData----pWideFileData
        
        // 先得到预转换的宽字节的字符数,iWideBufferSize肯定小于dwFileSize
        iWideBufferSize = MultiByteToWideChar(    CP_ACP,    //字符页码类型,932-日文系统ANSI,936--中文系统ANSI
                                                0,        // 一般置为0
                                                (LPCSTR)pSaveFileData,//多自己字符
                                                dwFileSize ,//多字节字符数
                                                NULL,        //宽字节字符此时置为空
                                                0            // 宽字节字符数此时为0,函数才会返回预转换的宽字节的字符数
                                            );

        // 对返回值判断
        if( 0 == iWideBufferSize ){
            goto PROC_END;
        }

        // 首先给参数分配空间
        try{
            pWideFileData = new wchar_t[iWideBufferSize + 1];
            memset( pWideFileData,0, (iWideBufferSize +1)*sizeof(wchar_t) );

        }catch( CException * ){
            pWideFileData = NULL;
            goto PROC_END;
        }

        // 转换
        iWideBufferSize = MultiByteToWideChar(    CP_ACP,
                                                0,
                                                (LPCSTR)pSaveFileData,
                                                dwFileSize ,
                                                pWideFileData,
                                                iWideBufferSize
                                            );

        // 最后以空字符结束,若无此句,pWideFileData最后会有乱码
        //pWideFileData[ iWideBufferSize ] = L'/0';

    }

PROC_END:

    if( INVALID_HANDLE_VALUE != hFile){
        CloseHandle( hFile  );
    }

    if( NULL != pSaveFileData){
        delete pSaveFileData;
    }
    if( NULL != pWideFileData){
        delete pWideFileData;
    }

    return;
}

你可能感兴趣的:(VC++编程)