高分请教:打开文件时:“在访问 xxx.exe时发生共享违例”,详见帖子
一个简单的下载程序,有如下代码
void Download(const char *pMsg, DWORD len)
{
srand(time(NULL));
static fileIndex = rand();
char fileName[256] = {0};
sprintf(fileName, "%u.exe", fileIndex);
static DWORD totalSize = 22222;
CFile file;
CFileException err;
if ( !file.Open(fileName, CFile::modeWrite|CFile::modeCreate|CFile::typeBinary|CFile::modeNoTruncate, &err) )
{
TCHAR errInfo[1024];
err.GetErrorMessage(errInfo, 1024);
AfxMessageBox(errInfo);
}
else
{
static DWORD fileOffset = 0; //当前文件偏移
DWORD regSize = 1024; //每次请求的大小
file.SeekToEnd();
file.Write(pMsg,len); //写入接收到的数据
file.Close();
fileOffset += len; //文件偏移
if ( fileOffset >= totalSize )
{
AfxMessageBox(_T("download finish"));
// SendDownRequest(fileOffset, regSize); ----------语句A
}
else
{
if ( (totalSize - fileOffset) <regSize )
{
regSize = totalSize - fileOffset;
}
SendDownRequest(fileOffset, regSize); //请求后边的数据
}
}
}
从网络上获取到的文件数据,
通过函数Download写入,然后根据下载数据总量判断是否完成,没有完成,则继续请求后边的数据,直到完成
操作方式
1、同时开多个程序(由于Download通过随机数生成的文件名,所以不存在重复文件名,并且在所生成的目录确认过,文件名不重复);
2、下载的文件为exe可执行文件;
3、同时开的几个进程中,某个或某几个会出现打开文件失败:在访问 xxx.exe时发生共享违例
4、出现打开文件失败的进程在最开始几次肯定可以正常打开文件,只是中途可能会出现打开失败
5、如果在打开时候的时候继续向服务器请求(即把语句A的注释打开),在几次打开失败后,当重新受到网络来的数据,该进程又会成功打开改文件。
请不吝赐教,
1、出现这种情况的原因是如何引起的;
2、如何处理避免打开文件失败现象的发生;
定当高分感谢。
[解决办法]
查看打开文件失败时返回的error code,看具体什么原因
[解决办法]
err.GetErrorMessage 返回的是 “在访问 xxx.exe时发生共享违例”吗?
在err.GetErrorMessage()之前GetLastError()看得到多少?
[解决办法]
以共享方式打开
CFile::shareDenyNone Opens the file without denying other processes read or write access to the file. Create fails if the file has been opened in compatibility mode by any other process.
CFile::shareDenyRead Opens the file and denies other processes read access to the file. Create fails if the file has been opened in compatibility mode or for read access by any other process.
CFile::shareDenyWrite Opens the file and denies other processes write access to the file. Create fails if the file has been opened in compatibility mode or for write access by any other process.
[解决办法]
PathFileExists 先检查下文件是否存在,如果存在换名
[解决办法]
按6楼的 打开文件时,加上CFile::shareXXX选项,然后再测试看看。
你说的1)和2) 也会产生对你的文件的访问,会有影响。但一切以测试结果为准。
[解决办法]
从楼主的代码看,会有重复的文件名情况发生。
首先rand()是伪随机数产生函数,其值序列取决于srand()的种子。
种子一样的情况下,序列值是一样的。
其次楼主代码中种子用的是time(NULL),这个函数最小单位是秒,
也就是说如果在同一秒内执行,得到的值是一样的。
建议楼主修改种子,让种子同进程ID还有线程ID和时间同时相关,这样才不会产生重复的情况
[解决办法]
多线程的话,查看文件在不在然后创建文件的这过程中加上锁
[解决办法]
3、同时开的几个进程中,某个或某几个会出现打开文件失败:在访问 xxx.exe时发生共享违例
这样就会导致多线程调用了,因为你不能确保你的随机数会不重复的
------解决方案--------------------
任务管理器看一下,是不是有相同的进程没关掉