首页
论坛
课程
招聘
[原创]一个文件句柄标示的文件有且仅有一个文件指针。
2011-10-26 21:45 3101

[原创]一个文件句柄标示的文件有且仅有一个文件指针。

2011-10-26 21:45
3101
问题来源:
一个文件可以定位多个文件指针吗
比如说现在有个文件10个字节
我用2个线程写
第一个线程从前面写,写前5个字节
第二个线程从后面开始写,也是5个字节
能实现吗

#include<windows.h>
#include<process.h>
#include<iostream>
using namespace std;
#define BUFSIZE 5
HANDLE hFile;

DWORD __stdcall CreateThreadFunc(LPVOID)
{
	cout<<"进入子线程"<<endl;
	SetFilePointer(hFile,5,0,FILE_BEGIN);
	char chBuffer[BUFSIZE];
	memcpy(chBuffer,"a boy",5);
	DWORD dwWriteSize=0;
	WriteFile(hFile,chBuffer,5,&dwWriteSize,NULL);
	return 0;

}
int main()
{
	hFile=CreateFile("test.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	cout<<GetLastError()<<endl;
	//SetFileValidData(hFile,10);
	HANDLE hFileMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,10,NULL);
	cout<<GetLastError()<<endl;
	char chBuffer[BUFSIZE];
	memcpy(chBuffer,"yirui",5);
	DWORD dwWriteSize=0;
	SetFilePointer(hFile,0,0,FILE_END);
	WaitForSingleObject(CreateThread(NULL,0,CreateThreadFunc,0,0,0),INFINITE);
	WriteFile(hFile,chBuffer,5,&dwWriteSize,NULL);
	CloseHandle(hFileMap);
	CloseHandle(hFile);
	return 0;
}

输出结果证明了确实只有一个文件定位指针。
测试过程中发现不会使用SetFileValidData,所以改用了内存映射,还请大家看看这个函数如何使用,谢谢!

[注意] 招人!base上海,课程运营、市场多个坑位等你投递!

收藏
点赞0
打赏
分享
最新回复 (2)
雪    币: 514
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
xacker 活跃值 1 2011-10-26 21:57
2
0
个人猜测  一个句柄应该只有1个文件位置指针   线程另外CreateFile一个试试
使用映射的话直接操作内存就可以了   完了UnmapViewOfFile 系统会更新文件的
雪    币: 96
活跃值: 活跃值 (70)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
yiruirui 活跃值 1 2011-10-26 23:32
3
0
#include<windows.h>
#include<process.h>
#include<iostream>
using namespace std;
#define BUFSIZE 5

DWORD __stdcall CreateThreadFunc(LPVOID)
{
	cout<<"进入子线程"<<endl;
	OFSTRUCT os={sizeof(OFSTRUCT)};
	HANDLE hFile=(HANDLE)OpenFile("test.txt",&os,OF_READWRITE);
	cout<<GetLastError()<<endl;
	SetFilePointer(hFile,5,0,FILE_BEGIN);
	char chBuffer[BUFSIZE];
	memcpy(chBuffer,"a boy",5);
	DWORD dwWriteSize=0;
	WriteFile(hFile,chBuffer,5,&dwWriteSize,NULL);
	CloseHandle(hFile);
	return 0;

}
int main()
{
	HANDLE hFile=CreateFile("test.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	cout<<GetLastError()<<endl;
	//SetFileValidData(hFile,4);
	HANDLE hFileMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,10,NULL);
	cout<<GetLastError()<<endl;
	char chBuffer[BUFSIZE];
	memcpy(chBuffer,"yirui",5);
	DWORD dwWriteSize=0;
	SetFilePointer(hFile,0,0,FILE_BEGIN);
	WaitForSingleObject(CreateThread(NULL,0,CreateThreadFunc,0,0,0),INFINITE);
	WriteFile(hFile,chBuffer,5,&dwWriteSize,NULL);
	CloseHandle(hFileMap);
	CloseHandle(hFile);
	return 0;
}

一个文件可以定义多个文件指针而互不干扰彼此,但是一个文件句柄就只能对应一个文件指针。
游客
登录 | 注册 方可回帖
返回