//利用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;
}
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;
}