// FileOp.h
#ifndef _FILEOP_H_
#define _FILEOP_H_
#include <stdio.h>
#include <stdlib.h>
#ifndef SAFE_FREE
#define SAFE_FREE(p) if(p) { free(p); p = NULL; }
#endif
#ifdef __cplusplus
extern "C" {
#endif
//------------------------------------------------------------------------
// FILE_OP_GetFileSize()
// - 获取文件的长度
// szFileName - 文件名
// pulFileSize - 返回的文件的长度(单位:字节)
//------------------------------------------------------------------------
int FILE_OP_GetFileSize(const char* szFileName, unsigned long* pulFileSize);
//------------------------------------------------------------------------
// FILE_OP_RetFileSize()
// - 获取文件的长度
// szFileName - 文件名
// 函数返回值:文件的长度(单位:字节)
//------------------------------------------------------------------------
int FILE_OP_RetFileSize(const char* szFileName);
//------------------------------------------------------------------------
// FILE_OP_ReadDataFromFile()
// - 获取文件中指定长度的数据内容
// szFileName - 文件名
// pbData - 返回的数据内容
// ulDataSize - 数据的长度(单位:字节)
//------------------------------------------------------------------------
int FILE_OP_ReadDataFromFile(const char* szFileName,
unsigned char* pbData, unsigned long ulDataSize);
//------------------------------------------------------------------------
// FILE_OP_ReadAllDataFromFile()
// - 获取文件中所有内容
// szFileName - 文件名
//------------------------------------------------------------------------
char* FILE_OP_ReadAllDataFromFile(const char* szFileName);
#define FLAG_SZ_END_WITH_ZERO 1
#define FLAG_SZ_END_WITHOUT_ZERO 0
//------------------------------------------------------------------------
// FILE_OP_ReadAllDataFromFileEx()
// - 获取文件中所有内容,并且可选择是否以'\0'结尾
// szFileName - 文件名
// flag_sz - 是否以'\0'结尾。0:否;1:是
//------------------------------------------------------------------------
char* FILE_OP_ReadAllDataFromFileEx(const char* szFileName, int flag_sz);
//------------------------------------------------------------------------
// FILE_OP_WriteDataToFile()
// - 保存数据到文件
// szFileName - 文件名
// pbData - 要保存的数据
// ulDataSize - 数据的长度(单位:字节)
//------------------------------------------------------------------------
int FILE_OP_WriteDataToFile(const char* szFileName,
const unsigned char* pbData, unsigned long ulDataSize);
//------------------------------------------------------------------------
// FILE_OP_AppendDataToFile()
// - 附加数据到文件末尾
// szFileName - 文件名
// pbData - 要附加的数据
// ulDataSize - 数据的长度(单位:字节)
//------------------------------------------------------------------------
int FILE_OP_AppendDataToFile(const char* szFileName,
const unsigned char* pbData, unsigned long ulDataSize);
#ifdef __cplusplus
}
#endif
#endif // _FILEOP_H_
// FileOp.cpp
#include "FileOp.h"
int FILE_OP_GetFileSize(const char* szFileName, unsigned long* pulFileSize)
{
FILE *fp = fopen(szFileName, "rb");
if ( fp )
{
fseek(fp, 0, SEEK_END);
*pulFileSize = ftell(fp);
fclose(fp);
return 0;
}
return -1;
}
int FILE_OP_RetFileSize(const char* szFileName)
{
int iFileLen = 0;
FILE *fp = fopen(szFileName, "rb");
if ( fp )
{
fseek(fp, 0, SEEK_END);
iFileLen = ftell(fp);
fclose(fp);
}
return iFileLen;
}
int FILE_OP_ReadDataFromFile(const char* szFileName, unsigned char* pbData, unsigned long ulDataSize)
{
unsigned long ulReadedSize = 0;
FILE *fp = fopen(szFileName, "rb");
if ( fp )
{
ulReadedSize = (unsigned long)fread(pbData, 1, ulDataSize, fp);
fclose(fp);
return ( ulReadedSize == ulDataSize ) ? 0 : -1;
}
return -1;
}
char* FILE_OP_ReadAllDataFromFile(const char* szFileName)
{
unsigned long ulFileSize = 0;
if ( 0 == FILE_OP_GetFileSize(szFileName, &ulFileSize) )
{
char* pbBuffer = (char*)malloc(ulFileSize);
if ( 0 == FILE_OP_ReadDataFromFile(szFileName, (unsigned char*)pbBuffer, ulFileSize) )
{
return pbBuffer;
}
else
{
free(pbBuffer);
return NULL;
}
}
return NULL;
}
char* FILE_OP_ReadAllDataFromFileEx(const char* szFileName, int flag_sz)
{
unsigned long ulFileSize = 0;
if ( 0 == FILE_OP_GetFileSize(szFileName, &ulFileSize) )
{
char* pbBuffer = NULL;
if ( 1 == flag_sz )
{
pbBuffer = (char*)malloc(ulFileSize+1);
}
else
{
pbBuffer = (char*)malloc(ulFileSize);
}
if ( 0 == FILE_OP_ReadDataFromFile(szFileName, (unsigned char*)pbBuffer, ulFileSize) )
{
if ( 1 == flag_sz )
{
pbBuffer[ulFileSize] = '\0';
}
return pbBuffer;
}
else
{
free(pbBuffer);
return NULL;
}
}
return NULL;
}
int FILE_OP_WriteDataToFile(const char* szFileName, const unsigned char* pbData, unsigned long ulDataSize)
{
unsigned long ulWritedSize = 0;
FILE *fp = fopen(szFileName, "wb");
if ( fp )
{
ulWritedSize = (unsigned long)fwrite(pbData, 1, ulDataSize, fp);
fclose(fp);
return ( ulWritedSize == ulDataSize ) ? 0 : -1;
}
return -1;
}
int FILE_OP_AppendDataToFile(const char* szFileName, const unsigned char* pbData, unsigned long ulDataSize)
{
unsigned long ulWritedSize = 0;
FILE *fp = fopen(szFileName, "awb");
if ( fp )
{
ulWritedSize = (unsigned long)fwrite(pbData, 1, ulDataSize, fp);
fclose(fp);
return ( ulWritedSize == ulDataSize ) ? 0 : -1;
}
return -1;
}