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