1、創建隱藏屬性的臨時文件,且文件被關閉時會自動刪除
2、判斷訪問的文件類型(文件、磁盤、管道等)
3、文件的隨機讀寫操作
4、手動將寫入高速緩存中的數據,刷新到磁盤
5、動態調整文件的大小
6、獲取文件的邏輯大小或物理大小
//創建一個文件test.txt(隱藏的臨時文件,且文件關閉時會被系統自動刪除)
HANDLE hFile = CreateFile( TEXT("C:\\test3.txt")
,GENERIC_WRITE|GENERIC_READ //設備的訪問權限
,FILE_SHARE_WRITE|FILE_SHARE_READ //設備的共享權限
,NULL
,CREATE_ALWAYS
,FILE_ATTRIBUTE_TEMPORARY|FILE_ATTRIBUTE_HIDDEN|FILE_FLAG_DELETE_ON_CLOSE/*|FILE_FLAG_WRITE_THROUGH*/
,NULL);
if (hFile == INVALID_HANDLE_VALUE) {
printf("創建可寫文件test.txt文件失敗!\n");
return -1;
}
switch(GetFileType(hFile))
{
case FILE_TYPE_DISK:
printf("訪問的文件是一個磁盤文件\n"); break;
case FILE_TYPE_CHAR:
printf("訪問的文件是一個字符文件,比如並口設備或控制檯\n"); break;
case FILE_TYPE_PIPE:
printf("訪問的文件是一個命名管道或匿名管道\n"); break;
case FILE_TYPE_UNKNOWN:
printf("訪問的文件爲未知類型\n"); break;
default:
printf("GetFileType()返回了一個不可預料的類型值\n"); break;
}
DWORD dwSize = 0;
char pBuf[100] = "使用CreateFile訪問文件對象(文件、目錄、磁盤驅動器、串口等)";
WriteFile(hFile, pBuf, strlen(pBuf), &dwSize, NULL);
//將數據從高速緩存中寫入到磁盤上
//打開文件時指定了FILE_FLAG_NO_BUFFERING或FILE_FLAG_WRITE_THROUGH標記時,寫入操作不會寫入到緩存,而是
//直接寫入到磁盤,因此,不必手動刷新緩存
FlushFileBuffers(hFile);
printf("寫入:%s ,%d\n", pBuf, dwSize);
//從文件的開始14字節後開始寫入
LARGE_INTEGER liCurrPosition = {0};
liCurrPosition.QuadPart = 14;
SetFilePointerEx(hFile, liCurrPosition, NULL, FILE_BEGIN);
strcpy_s(pBuf, " Randrom Write ");
WriteFile(hFile, pBuf, strlen(pBuf), &dwSize, NULL);
//從文件開始位置進行讀取
liCurrPosition.QuadPart = 0;
SetFilePointerEx(hFile, liCurrPosition, NULL, FILE_BEGIN);
memset(pBuf, 0, sizeof(pBuf));
ReadFile(hFile, pBuf, sizeof(pBuf)-1, &dwSize, NULL);
printf("讀取:%s ,%d\n", pBuf, dwSize);
#if 0
//設置文件大小爲1024byte
LARGE_INTEGER liCurrentPosition = {0};
liCurrentPosition.QuadPart = 1024;
SetFilePointerEx(hFile, liCurrentPosition, NULL, FILE_BEGIN);
SetEndOfFile(hFile);
#endif
//獲取文件大小
LARGE_INTEGER liFileSize = {0};
GetFileSizeEx(hFile, &liFileSize);
printf("文件大小: 邏輯大小%dbyte, ", liFileSize.QuadPart);
GetCompressedFileSize(TEXT("C:\\test.txt"), (DWORD*)&liFileSize.HighPart);
printf("物理大小%dbyte\n",liFileSize.HighPart);;
CloseHandle(hFile);