bool MkFileChunk::AttachOriginalFiles (const MkPathName& chunkFilePath, MkFilePathListContainer& filePathListContainer, MkArray<MkPathName>& memberFilePathList, unsigned int chunkSizeGuideline, unsigned int percentageForCompressing, bool createNewChunk) { memberFilePathList.Clear(); MkArray<MkPathName>& relativeFilePathList = filePathListContainer.GetRelativeFilePathList(); unsigned int startCount = relativeFilePathList.GetSize(); MK_CHECK(startCount > 0, L"파일 경로 리스트가 비어 " + m_AbsoluteChunkFilePath + L" 청크 파일 구성 불가") return false; if (createNewChunk) { MK_CHECK(!chunkFilePath.IsDirectoryPath(), chunkFilePath + L" 청크 파일 경로 오류") return false; Clear(); // 새 청크 파일 이름 m_AbsoluteChunkFilePath.ConvertToRootBasisAbsolutePath(chunkFilePath); } // 크기 예약 m_BlockList.Reserve(m_BlockList.GetSize() + startCount); memberFilePathList.Reserve(startCount); // 인터페이스 생성. createNewChunk에 따라 청크 파일 생성 MkInterfaceForFileWriting chunkFileInterface; if (!chunkFileInterface.SetUp(m_AbsoluteChunkFilePath, createNewChunk)) return false; // 새 청크 파일의 경우 블록 카운트를 기록하기 위한 태그 공간 확보 if (createNewChunk) { m_ChunkSize = sizeof(unsigned int); _AddCountTag(chunkFileInterface, m_ChunkSize); } // 뒤에서부터 앞으로 순회 MK_INDEXING_RLOOP(relativeFilePathList, i) { const MkPathName& currPath = filePathListContainer.GetRelativeFilePath(i); MkFileBlock& currBlock = m_BlockList.PushBack(); unsigned int blockSize = currBlock.SetUpFromOriginalFileAndAttachToChunkFile (filePathListContainer.GetAbsoluteOriginalFilePath(i), currPath, chunkFileInterface, percentageForCompressing, filePathListContainer.GetOuterWrittenTime(i)); if (blockSize == 0) { if (createNewChunk) { m_AbsoluteChunkFilePath.DeleteCurrentFile(); } return false; } memberFilePathList.PushBack(currPath); ++m_AvailableBlockCount; m_ChunkSize += blockSize; if (m_ChunkSize >= chunkSizeGuideline) break; } chunkFileInterface.Clear(); // 블록 카운트 수정 MkInterfaceForFileTag<unsigned int> ftInterface; if (!ftInterface.SetUp(m_AbsoluteChunkFilePath)) { if (createNewChunk) { m_AbsoluteChunkFilePath.DeleteCurrentFile(); } return false; } ftInterface.Overwrite(m_BlockList.GetSize(), 0); ftInterface.Clear(); // 청크에 구성된 파일들을 리스트에서 삭제 filePathListContainer.PopBack(memberFilePathList.GetSize()); return true; }
virtual bool SetUp(MkDataNode& sharingNode) { // [ data 형태 정의 ] //------------------------------------------------------------------------------------------------// // int a; // float b; // MkVec3 c; // wchar_t d[64]; //------------------------------------------------------------------------------------------------// // srcArray 생성 MkInterfaceForDataWriting dwInterface; dwInterface.SetInputSize(ePDT_Int, SIZE_COUNT); dwInterface.SetInputSize(ePDT_Float, SIZE_COUNT); dwInterface.SetInputSize(ePDT_Vec3, SIZE_COUNT); dwInterface.SetInputSize(ePDT_Str, SIZE_COUNT); dwInterface.UpdateInputSize(); for (int i=0; i<SIZE_COUNT; ++i) { float f = static_cast<float>(i); dwInterface.Write(static_cast<int>(i)); dwInterface.Write(static_cast<float>(f * -10.f)); dwInterface.Write(MkVec3(f, f * -2.f, f * 3.f)); dwInterface.Write(MkStr(L"잘생겨서 죄송요~")); } MkByteArray srcArray; dwInterface.Flush(srcArray); dwInterface.Clear(); // srcArray -> 파일로 출력 MkInterfaceForFileWriting fwInterface; fwInterface.SetUp(L"test.data", true, true); fwInterface.Write(srcArray, MkArraySection(0)); fwInterface.Clear(); srcArray.Clear(); // 파일을 destBuffer에 읽음 MkByteArray destBuffer; MkInterfaceForFileReading frInterface; frInterface.SetUp(L"test.data"); frInterface.Read(destBuffer, MkArraySection(0)); frInterface.Clear(); MK_DEV_PANEL.MsgToLog(MkStr::EMPTY); // 빈 칸 하나 넣고, // 읽어들인 결과 출력. 첫번째와 마지막 unit 대상 MkInterfaceForDataReading drInterface; drInterface.SetUp(destBuffer, 0); for (int i=0; i<SIZE_COUNT; ++i) { int a = 0; drInterface.Read(a); float b = 0.f; drInterface.Read(b); MkVec3 c = MkVec3::Zero; drInterface.Read(c); MkStr d; drInterface.Read(d); if (i == 0) { MK_DEV_PANEL.MsgToLog(L"[ First unit ]"); MK_DEV_PANEL.MsgToLog(L" a : " + MkStr(a)); MK_DEV_PANEL.MsgToLog(L" b : " + MkStr(b)); MK_DEV_PANEL.MsgToLog(L" c : " + MkStr(c)); MK_DEV_PANEL.MsgToLog(L" d : " + MkStr(d)); } else if (i == (SIZE_COUNT - 1)) { MK_DEV_PANEL.MsgToLog(L"[ Last unit ]"); MK_DEV_PANEL.MsgToLog(L" a : " + MkStr(a)); MK_DEV_PANEL.MsgToLog(L" b : " + MkStr(b)); MK_DEV_PANEL.MsgToLog(L" c : " + MkStr(c)); MK_DEV_PANEL.MsgToLog(L" d : " + MkStr(d)); } } destBuffer.Clear(); // 출력 폴더 열기 MkPathName::GetRootDirectory().OpenDirectoryInExplorer(); return true; }