void FileSetupUpdate(void)
{
SaveDataIndex *UpdateCurrentIndex;
BOOL IsFileChange;
if(GetTickCount()-LastFileChangTick <= 100)
return;
EnterCriticalSection(&CS_ReadFile);
EnterCriticalSection(&CS_SaveFile);
IsFileChange=FALSE;
// 파일이없거나 비었을경우
if(IndexFileItemCnt == 0)IsFileChange=TRUE;
else if(IndexFileBase)
{
// 현재까지 진행된 위치를얻음
UpdateCurrentIndex=(SaveDataIndex*)IndexFileBase;
// 파일을끝까지 다읽었을경우
if(UpdateCurrentIndex->Offset.QuadPart >= IndexFileItemCnt)
{
IsFileChange=TRUE;
}
}
// 파일을교환해야하는 조건
if(IsFileChange)
{
LastFileChangTick=GetTickCount();
// 인덱스파일이 매핑되어있다면
if(IndexFileMapping)
{
// 이전인덱스파일의 MMF를 해제한다
if(IndexFileBase)UnmapViewOfFile(IndexFileBase);
CloseHandle(IndexFileMapping);
// 인덱스파일 내용 지우기
SetFilePointer(hIndexFile[!SaveFileNo],0,0,FILE_BEGIN);
SetEndOfFile(hIndexFile[!SaveFileNo]);
//
SetFilePointer(hSaveFile[!SaveFileNo],0,0,FILE_BEGIN);
SetEndOfFile(hSaveFile[!SaveFileNo]);
FlushFileBuffers(hIndexFile[!SaveFileNo]);
FlushFileBuffers(hSaveFile[!SaveFileNo]);
}
// 초기화
SavedFileSize.QuadPart=0;
IndexFileMapping=NULL;
IndexFileBase=NULL;
IndexFileSize.QuadPart=0;
IndexFileItemSendCnt=0;
IF_Cnt=0;
AMF=0;// 디버깅용 변수
SumDataCnt=0;// 디버깅용 변수
// 파일인덱스 교환
SaveFileNo=!SaveFileNo;
// 새료쓰여질 인덱스파일 파일을 셋팅한다
LARGE_INTEGER FileSize;
// 파일크기얻어냄
GetFileSizeEx(hIndexFile[SaveFileNo],&FileSize);
// 새로만들어진 파일이다
if(FileSize.QuadPart == 0)
{
// 진행위치 옵셋초기값으로 저장
DWORD Written;
SaveDataIndex Info;
Info.Offset.QuadPart=0;
Info.SendFlag='_';
WriteFile(hIndexFile[SaveFileNo],&Info,sizeof(SaveDataIndex),&Written,NULL);
}
// 읽어올저장파일의 크기를구한다
GetFileSizeEx(hSaveFile[!SaveFileNo],&SavedFileSize);
// 읽어올인덱스파일을 셋팅한다
GetFileSizeEx(hIndexFile[!SaveFileNo],&IndexFileSize);
// 몇개의 데이터가 들어있는지 계산한다
IndexFileItemCnt=(IndexFileSize.QuadPart-sizeof(SaveDataIndex))/sizeof(SaveDataIndex);
if(IndexFileItemCnt < 0)IndexFileItemCnt=0;
// 인덱스데이터가 있으면
if(IndexFileItemCnt > 0)
{
// 파일매핑
IndexFileMapping=CreateFileMapping(
hIndexFile[!SaveFileNo],
NULL,
PAGE_READWRITE,
0,
0,
NULL);
if(IndexFileMapping)
{
// 포인터 얻어내기
IndexFileBase=(BYTE*)MapViewOfFile(
IndexFileMapping,
FILE_MAP_READ|FILE_MAP_WRITE,
0,0,
0);
if(!IndexFileBase)
CloseHandle(IndexFileMapping);
}
}
// 매핑에 실패했을경우
if(!IndexFileBase)
IndexFileItemCnt=0;
// 새로운 저장데이터&인덱스 파일의 파일포인터를 최후미에 갔다둠
SetFilePointer(hSaveFile[SaveFileNo],0,0,FILE_END);
SetFilePointer(hIndexFile[SaveFileNo],0,0,FILE_END);
if(IndexFileItemCnt > 0)
FileChangPerSec++;
}
LeaveCriticalSection(&CS_SaveFile);
LeaveCriticalSection(&CS_ReadFile);
}
위에껀 오토바이사고로 두다리 부러졌을대 마약성 진통재 먹으면서
만든코드인데 지금보니 신기함
소스가 긴대 DC 업로드 한계때문에 잘라내다보니 얼마 표시못함
서버 안되면 ㅈ된다는 압박감과 만드는재미 크...
재미나고 좋음
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.