for(int i=0;i<=2;i++)
{
HANDLE fp = CreateFile(TEXT("D://jyzhj2.rar"),//這里輸入需要復制的檔案 src
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if(fp == NULL)
{
MessageBox(L"錯誤");
}
DWORD dwBytesInBlock = GetFileSize(fp,NULL); //檔案長度
HANDLE hFileMapping = CreateFileMapping(fp,
NULL,
PAGE_READWRITE,
0,//(DWORD)(dwBytesInBlock >> 16),
dwBytesInBlock,//(DWORD)(dwBytesInBlock & 0x0000FFFF),
NULL);
int dwError = GetLastError();
// 釋放檔案內核物件
CloseHandle(fp);
// 偏移地址
__int64 qwFileOffset = 0;
// 將檔案資料映射到行程的地址空間
LPVOID pbFile = MapViewOfFile( hFileMapping,
FILE_MAP_ALL_ACCESS,
(DWORD)(qwFileOffset >> 32),
(DWORD)(qwFileOffset & 0xFFFFFFFF),
dwBytesInBlock);
HANDLE wp = CreateFile( TEXT("D://仙劍5.rar"),//這里輸入 需要粘貼的檔案 dst
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
CREATE_ALWAYS,
FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_WRITE_THROUGH,
NULL);
HANDLE hFileMapping2 = CreateFileMapping( wp,
NULL,
PAGE_READWRITE,
0,//(DWORD)(dwBytesInBlock >> 16),
dwBytesInBlock,//(DWORD)(dwBytesInBlock & 0x0000FFFF),
NULL);
CloseHandle(wp);
LPVOID pbFile2 = MapViewOfFile( hFileMapping2,
FILE_MAP_ALL_ACCESS,
(DWORD)(qwFileOffset >> 32),
(DWORD)(qwFileOffset & 0xFFFFFFFF),
dwBytesInBlock);
memcpy(pbFile2,pbFile,dwBytesInBlock);
UnmapViewOfFile(pbFile2);
UnmapViewOfFile(pbFile);
CloseHandle(hFileMapping2);
CloseHandle(hFileMapping);
}
一直在memcpy(pbFile2,pbFile,dwBytesInBlock); 中斷
Mapping.exe 中的 0x1023fde0 (msvcr90d.dll) 處最可能的例外: 0xC0000005: 讀取位置 0x00000000 時發生訪問沖突
Mapping.exe 中的 0x1023fde0 (msvcr90d.dll) 處未處理的例外: 0xC0000005: 讀取位置 0x00000000 時發生訪問沖突
uj5u.com熱心網友回復:

uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
新手求指導啊uj5u.com熱心網友回復:
檢查pbFile 中MapViewOfFile函式的各個引數是否有設定對uj5u.com熱心網友回復:
查看一下錯誤碼等,GetLastErroruj5u.com熱心網友回復:
錯誤碼是87,引數錯誤?
uj5u.com熱心網友回復:
我想要的是把一個檔案里的資料寫入到另一個檔案,無線寫入,越大越好,應該怎么辦uj5u.com熱心網友回復:
freadfwrite
uj5u.com熱心網友回復:
小心駛得萬年船!僅供參考:
#include <sys\stat.h>
#include <io.h>
#include <fcntl.h>
#include <share.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define MAX_CLU_BYTES 65536
FILE *fo;
int fh;
__int64 offs,offs1;
__int64 rvi64;
int rv,wrv;
unsigned char buf[MAX_CLU_BYTES];
char ofn[_MAX_PATH];
char offstr[80];
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
char fullpath[_MAX_PATH];
void strcpybutcomma(char *t,char *s) {
char c;
while (1) {
c = *s++;
if (','!=c) *t++ = c;
if (0==c) break;
}
}
int main(int argc,char **argv) {
if (argc<3) {
printf("Copy File Tail.\n");
printf("Usage:\n");
printf(" cft filename.ext {Offset_Begin|-Offset_End|Offset_Begin-Offset_End}\n");
printf("Copy filename.ext {OB|-OE|OB-OE} to {OB|~OE|OB-OE}-filename.ext\n");
printf("Note: Byte at OE is NOT included.\n");
printf("Example:\n");
printf(" cft abc.rar 12345\n");
printf("Copy abc.rar offset 12345-end to 12345-abc.rar\n");
printf(" cft abc.rar -12345\n");
printf("Copy abc.rar offset -12345-end to ~12345-abc.rar\n");
printf(" cft abc.rar 123-12345\n");
printf("Copy abc.rar offset 123-12345 to 123-12345-abc.rar\n");
printf(" cft abc.rar 0xAB-0xCD\n");
printf("Copy abc.rar offset 0xAB-0xCD to 0xAB-0xCD-abc.rar\n");
return 1;
}
strcpybutcomma(offstr,argv[2]);
rv=sscanf(offstr,"%I64i-%I64i",&offs,&offs1);
if (rv==0) {
printf("offset %s is not number\n",argv[2]);
return 2;
}
if (NULL==_fullpath(fullpath,argv[1],_MAX_PATH)) {
printf("Can not get fullpath of %s\n",argv[1]);
return 10;
}
fh=_sopen(fullpath,_O_BINARY|_O_RDONLY|_O_RANDOM,_SH_DENYNO);
if (fh==-1) {
printf("_sopen %s errno=%d %s\n",fullpath,errno,strerror(errno));
return 3;
}
if (rv==1) {
offs1=_filelengthi64(fh);
if (offs1==-1i64) {
printf("%I64d=_filelengthi64 errno=%d %s\n",offs1,errno,strerror(errno));
_close(fh);
return 4;
}
if (offs<0i64) {
offs=offs1+offs;
if (offs<0i64) offs=0i64;
}
} else {//rv==2
if (offs>offs1) {
printf("%s offset_begin %I64d > %I64d offset_end error\n",argv[2],offs,offs1);
_close(fh);
return 5;
}
}
rvi64=_lseeki64(fh,offs,SEEK_SET);
if (rvi64!=offs) {
printf("%I64d=_lseeki64 %I64d errno=%d %s\n",rvi64,offs,errno,strerror(errno));
_close(fh);
return 6;
}
_splitpath(fullpath,drive,dir,fname,ext);
if (offstr[0]=='-') offstr[0]='~';
sprintf(ofn,"%s%s%s-%s%s",drive,dir,offstr,fname,ext);
fo=fopen(ofn,"wb");
if (fo==NULL) {
printf("fopen %s errno=%d %s\n",ofn,errno,strerror(errno));
_close(fh);
return 7;
}
cprintf("\n%I64d\r",offs);
while (1) {
rv=_read(fh,buf,(unsigned int)__min(offs1-offs,MAX_CLU_BYTES));
if (rv==0) break;//
if (rv<0) {
printf("_read %s offset %I64d errno=%d %s\n",fullpath,offs,errno,strerror(errno));
fclose(fo);
_close(fh);
return 8;
}
wrv=fwrite(buf,1,rv,fo);
if (wrv!=rv) {
printf("fwrite %s errno=%d %s\n",ofn,errno,strerror(errno));
fclose(fo);
_close(fh);
return 9;
} else {
offs+=rv;
cprintf("%I64d\r",offs);
if (offs>=offs1) break;//
}
}
fclose(fo);
_close(fh);
printf("Copy %s offset %s to %s OK.\n",fullpath,argv[2],ofn);
return 0;
}
uj5u.com熱心網友回復:
每一步操作都應該判斷回傳值, 確定錯誤狀態映射期間不能釋放檔案句柄 CloseHandle(fp); 放到最后
uj5u.com熱心網友回復:
在新版Windows(NT6)中,File Mapping已經取消。如果是舊版XP,則是中了病毒。軟體病毒,硬體病毒都有可能。
硬體病毒是納米人破壞硬碟上的存盤造成的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/129733.html
標籤:基礎類
