windows文件的常規讀寫

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);


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