SDK獲取文件大小 讀取文件內容

/*頭文件*/
#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章