在映射之后,文件不能关闭,只有在所有映射结束后才可以关闭,错误类型就是这么导致的。
还有,你既然是多线程上传,为什么还要用CriticalSection? 每个线程操作各自那部分就可以了,分配好了应该没有冲突的。我建议你设置一个全局标志,文件只打开一次,同时建立映射,在各个线程里打开映射就可以了,上传完毕后再关闭文件。这样就没有文件共享冲突的问题。ERROR 1006:
The volume for a file has been externally altered so that the opened file is no longer valid. ERROR_FILE_INVALID
还有,你既然是多线程上传,为什么还要用CriticalSection? 每个线程操作各自那部分就可以了,分配好了应该没有冲突的。我建议你设置一个全局标志,文件只打开一次,同时建立映射,在各个线程里打开映射就可以了,上传完毕后再关闭文件。这样就没有文件共享冲突的问题。ERROR 1006:
The volume for a file has been externally altered so that the opened file is no longer valid. ERROR_FILE_INVALID
解决方案 »
- DLL 隐式加载
- 线程之间的数据更新问题
- 用skin++后release不通过
- 在文本中修改指定行、列的字符,如何实现严格的格式控制?
- 有没有工具让我能够看到将宏展开后的代码?
- 程序末尾有断点,去不掉怎么办?
- 哪位帮忙介绍几本对ATL讲解得比较好的书?
- 还是clistctrl的选中问题,CSDN翻遍了都没有找到我想要得 帮忙帮忙
- 在UDP定义中,sin.sin_port = htons(0); 的0是何意思?是否只要在sendto指定对方地址就可以,本方port不用指定,除非也要收。
- 急急急!!!看看下面这个select 语句我错在哪里了?
- 哪里有下载工具的原码下载?
- 傻瓜问题:screentoclient是干什么用的
......
else
{
CFile SrcFile(szSrcName,CFile::modeRead);
dwSize=SrcFile.GetLength();
SrcFile.Close();
}
还有,就是如果不用CriticalSection的话,几个线程用OpenFileMapping打开同一个映射会不会冲突?谢谢!
如果你想上传到多个服务器,每个服务器开一个线程,可以如下处理:方法一 还是用FileMapping, 就是只建立一次,在每个线程中new一份内存,用memcpy()把FileMapping所影射的内容拷贝到这块内存中,在复制过程中可以用互斥对象来防止内存访问冲突。然后就可以上传了。所有线程都复制完毕后,就可以关闭映射了。至于文件大小,最好设置全局变量。方法二 不用FileMapping,在进入线程前把文件拷贝到内存中,在每一个线程中先申请一块同样大小的内存,内存大小可以用 把文件内容所在内存复制一份,所有线程复制完毕后,就可以释放掉分配的全局内存了。在复制的过程可以用互斥对象Mutex来防止内存访问冲突。注:其实实质和映射差不多,但是避免了用映射函数的麻烦。我现在想到的方法比较笨,就是比较耗内存。
(openfile->malloc->memcpy->closefile)
~~~~~~~~~~~~~~~mutex~~~~~~~~~~~~~~~~~->upload->free->next file......
在这里放一天大家看一下再给分:BOOL WriteFile(CFtpConnection *pConnectionDes,LPCTSTR szSrcName,LPCTSTR szDesName,DWORD dwSize)
{
try
{
if(dwSize==0)
{
CInternetFile* pDesFile=pConnectionDes->OpenFile(szDesName,GENERIC_WRITE);
pDesFile->Close();
return TRUE;
} CString strname(szSrcName);
strname.Replace('\\','&');
strname.Replace('/','&'); EnterCriticalSection(&g_csection); HANDLE hMap=OpenFileMapping(FILE_MAP_READ,FALSE,strname);
if(hMap==NULL)
{
CFile SrcFile(szSrcName,CFile::modeRead);
hMap=CreateFileMapping((HANDLE)SrcFile.m_hFile,NULL,PAGE_READONLY,0,0,strname);
SrcFile.Close();
if(hMap==NULL)
{
// 出错处理
LeaveCriticalSection(&g_csection);
return FALSE;
}
}
LPVOID lpMapAddress=MapViewOfFile(hMap,FILE_MAP_READ,0,0,0); LeaveCriticalSection(&g_csection); CInternetFile* pDesFile=pConnectionDes->OpenFile(szDesName,GENERIC_WRITE);
DWORD dwCount=0;
while(dwSize!=0)
{
if(dwSize>=1024)
{
dwSize-=1024;
pDesFile->Write((LPVOID)((char*)lpMapAddress+dwCount),1024);
dwCount+=1024;
}
else
{
pDesFile->Write((LPVOID)((char*)lpMapAddress+dwCount),dwSize);
dwSize=0;
}
} pDesFile->Close();
UnmapViewOfFile(lpMapAddress);
CloseHandle(hMap); }
catch (...)
{
}
}
如果几个线程同时 读 同一文件的内存映像的同一字段时,是否会有问题呢?是不是会引发冲突呢?在这一点上面我一直不太清楚。