/*頭文件*/
#include<stdio.h>
#include<windows.h>
/******************************************
//DWORD ReadFileContent ( LPSTR szFilePath)
//功能:獲取文件大小 讀取文件內容
// 並以十六進制的形式打印出來
//參數:LPSTR szFilePath 文件路徑
*******************************************/
DWORD ReadFileContent (LPSTR szFilePath)
{
HANDLE hFileRead; //文件大小
//LARGE_INTEGER liFileSize; //保存文件大小 //修改
DWORD dwFileSize; //改
DWORD dwReadedSize; //成功讀文件數據大小
LONGLONG liTotalRead = 0; //累加計算以讀取文件的大小
BYTE lpFileDataBuffer[32]; //文件數據緩存
//打開已存在的文件讀取內容
hFileRead = CreateFile(szFilePath, //要打開的文件名
GENERIC_READ, //已讀的方式打開
FILE_SHARE_READ, //可共享讀
NULL, //默認安全設置
OPEN_EXISTING, //只打開已存在的文件
FILE_ATTRIBUTE_NORMAL, //常規文件屬性
NULL); //無模板
//打開文件是否成功
if(hFileRead == INVALID_HANDLE_VALUE)
{
printf("打開文件失敗:%d\n",GetLastError());
}
//if(!GetFileSize (hFileRead,&liFileSize)) //獲取文件的大小,返回BOOL值(改)
if(!(dwFileSize = GetFileSize (hFileRead,NULL)) )
{
printf("獲取文件大小失敗:%d",GetLastError());
}
else
{
//printf("文件大小爲:%d\n",liFileSize.QuadPart);
printf("文件大小爲:%d\n",dwFileSize); //
}
//循環讀取並打印文件內容
while(TRUE)
{
DWORD i;
//使用API函數ReadFile()讀取文件內容
if(!ReadFile(hFileRead, //讀取文件句柄
lpFileDataBuffer, //存儲文件的文件內容
32, //讀的大小(字節)
&dwReadedSize, //實際讀取的大小
NULL)) //不適用Overlapped
{
printf("讀取文件錯誤:%d\n",GetLastError());
break;
}
printf("讀取了%d字節,內容是:",dwReadedSize);
for(i=0; i<dwReadedSize; i++)
{
printf("0x%x ",lpFileDataBuffer[i]); //以十六進制形式輸出
}
printf("\n");
liTotalRead += dwReadedSize;
if( liTotalRead == dwFileSize ) //標記 此處存在問題
{
printf("讀取文件結束\n");
break;
}
}
CloseHandle(hFileRead); //關閉文件句柄
return 0;
}
/*************************************************
//DWORD SavaDataToFile(LPSTR szFilePath,
// LPVOID lpData,
// DWORD dwDataSize)
//功能:將數據存儲到文件末尾
//參數:LPSTR szFilePath 文件的路徑
// LPVOID lpData 需存儲的數據
// DWORD dwDatsSize 數據大小(字節)
**************************************************/
DWORD SavaDataToFile(LPSTR szFilePath,
LPVOID lpData,
DWORD dwDataSize)
{
HANDLE hFileWrite; //文件數據
DWORD dwWritedDataSize; //成功寫入的數據的大小
hFileWrite = CreateFile(szFilePath, //要打開文件
GENERIC_WRITE, //一些方式打開
0, //可供享讀
NULL, //默認安全設置
OPEN_ALWAYS, //打開已存在的文件,沒有則創建
FILE_ATTRIBUTE_NORMAL, //常規文件屬性
NULL); //無模板
//判斷是否打開成功
if(hFileWrite == INVALID_HANDLE_VALUE)
{
printf("文件打開失敗:%d\n",GetLastError());
}
//設置指針到文件尾(設置到文件尾的話就會從頭開始算起字節數,所以要覆蓋掉原來的數據。改成FILE_BEGIN)
//SetFilePointer(hFileWrite, 0, 0, FILE_END);
SetFilePointer(hFileWrite, 0, 0, FILE_BEGIN);
//將數據寫入文件
if(!WriteFile(hFileWrite, lpData, dwDataSize, &dwWritedDataSize,NULL))
printf("寫文件失敗:%d\n",GetLastError());
else
printf("寫入數據成功,寫入 %d 字節。\n",dwWritedDataSize);
CloseHandle(hFileWrite);
return 0;
}
/*************************************************
//int main(void)
//功能:演示使用SaveDataToFile和ReadFileContent函數
**************************************************/
int main(void)
{
//FILE *fp;
LPSTR szFileData = "fsjaky的博客:http://blog.csdn.net/fsjaky";
HANDLE hTest;
DWORD dwWritedDataSize;
SavaDataToFile("test.txt",szFileData,lstrlen(szFileData));
ReadFileContent("test.txt");
/*DeleteFile( "test.txt" ); //每次運行完後刪除文件,以免下次運行出錯
//使用DeleteFile()的原因,在ReadFileContent()函數中的判斷語句
//if( liTotalRead == liFileSize.QuadPart )如果不刪除內容,則出現死循環,
//liFileSize.QuadPart的值不斷在變化,將不會和liTotalRead相等
hTest = CreateFile("test.txt", //要打開的文件名
GENERIC_WRITE, //已寫的方式打開
FILE_SHARE_READ, //可共享讀
NULL, //默認安全設置
CREATE_ALWAYS, //總是創建
FILE_ATTRIBUTE_NORMAL, //常規文件屬性
NULL); //無模板
if(WriteFile(hTest, szFileData, lstrlen(szFileData), &dwWritedDataSize,NULL))
printf("寫入成功\n");
else
{
printf("寫入失敗%d\n",GetLastError());
}*/
CloseHandle( hTest );
//fclose(fp);
return 0;
}