bool CFSFolder::SaveComments() { AString utf; { UString unicode; _comments.SaveToString(unicode); ConvertUnicodeToUTF8(unicode, utf); } if (!utf.IsAscii()) utf.Insert(0, "\xEF\xBB\xBF" "\r\n"); FString path = _path + kDescriptionFileName; // We must set same attrib. COutFile::CreateAlways can fail, if file has another attrib. DWORD attrib = FILE_ATTRIBUTE_NORMAL; { CFileInfo fi; if (fi.Find(path)) attrib = fi.Attrib; } NIO::COutFile file; if (!file.CreateAlways(path, attrib)) return false; UInt32 processed; file.Write(utf, utf.Len(), processed); _commentsAreLoaded = false; return true; }
void PreAlloc(UInt64 preAllocSize) { _preAllocSize = 0; if (File.SetLength(preAllocSize)) _preAllocSize = preAllocSize; File.SeekToBegin(); }
STDMETHODIMP CFSFolder::CreateFile(const wchar_t *name, IProgress * /* progress */) { UString processedName; RINOK(GetComplexName(name, processedName)); NIO::COutFile outFile; if (!outFile.Create(processedName, false)) return ::GetLastError(); return S_OK; }
STDMETHODIMP CFSFolder::CreateFile(const wchar_t *name, IProgress * /* progress */) { FString absPath; GetAbsPath(name, absPath); NIO::COutFile outFile; if (!outFile.Create(absPath, false)) return ::GetLastError(); return S_OK; }
static HRESULT CopyFileSpec(CFSTR fromPath, CFSTR toPath, bool writeToDisk, UInt64 fileSize, UInt32 bufferSize, UInt64 progressStart, IProgress *progress) { NIO::CInFile inFile; if (!inFile.Open(fromPath)) return GetLastError(); if (fileSize == (UInt64)(Int64)-1) { if (!inFile.GetLength(fileSize)) ::GetLastError(); } NIO::COutFile outFile; if (writeToDisk) { if (!outFile.Open(toPath, FILE_SHARE_WRITE, OPEN_EXISTING, 0)) return GetLastError(); } else if (!outFile.Create(toPath, true)) return GetLastError(); CPhysTempBuffer tempBuffer; tempBuffer.buffer = MidAlloc(bufferSize); if (!tempBuffer.buffer) return E_OUTOFMEMORY; for (UInt64 pos = 0; pos < fileSize;) { UInt64 progressCur = progressStart + pos; RINOK(progress->SetCompleted(&progressCur)); UInt64 rem = fileSize - pos; UInt32 curSize = (UInt32)MyMin(rem, (UInt64)bufferSize); UInt32 processedSize; if (!inFile.Read(tempBuffer.buffer, curSize, processedSize)) return GetLastError(); if (processedSize == 0) break; curSize = processedSize; if (writeToDisk) { const UInt32 kMask = 0x1FF; curSize = (curSize + kMask) & ~kMask; if (curSize > bufferSize) return E_FAIL; } if (!outFile.Write(tempBuffer.buffer, curSize, processedSize)) return GetLastError(); if (curSize != processedSize) return E_FAIL; pos += curSize; } return S_OK; }
HRESULT CThreadCombine::ProcessVirt() { NIO::COutFile outFile; if (!outFile.Create(OutputPath, false)) { HRESULT res = GetLastError(); AddErrorPath(OutputPath); return res; } CProgressSync &sync = Sync; sync.Set_NumBytesTotal(TotalSize); CMyBuffer bufferObject; if (!bufferObject.Allocate(kBufSize)) return E_OUTOFMEMORY; Byte *buffer = (Byte *)(void *)bufferObject; UInt64 pos = 0; FOR_VECTOR (i, Names) { NIO::CInFile inFile; const FString nextName = InputDirPrefix + Names[i]; if (!inFile.Open(nextName)) { HRESULT res = GetLastError(); AddErrorPath(nextName); return res; } sync.Set_FilePath(fs2us(nextName)); for (;;) { UInt32 processedSize; if (!inFile.Read(buffer, kBufSize, processedSize)) { HRESULT res = GetLastError(); AddErrorPath(nextName); return res; } if (processedSize == 0) break; UInt32 needSize = processedSize; if (!outFile.Write(buffer, needSize, processedSize)) { HRESULT res = GetLastError(); AddErrorPath(OutputPath); return res; } if (needSize != processedSize) throw g_Message_FileWriteError; pos += processedSize; RINOK(sync.Set_NumBytesCur(pos)); } }
void Close() { SetCorrectFileLength(); Written = 0; _preAllocSize = 0; File.Close(); }
void SetCorrectFileLength() { if (Written < _preAllocSize) { File.SetLength(Written); _preAllocSize = 0; } }
bool CFSFolder::SaveComments() { NIO::COutFile file; if (!file.Create(_path + kDescriptionFileName, true)) return false; UString unicodeString; _comments.SaveToString(unicodeString); AString utfString; ConvertUnicodeToUTF8(unicodeString, utfString); UInt32 processedSize; if (!IsAscii(unicodeString)) { Byte bom [] = { 0xEF, 0xBB, 0xBF, 0x0D, 0x0A }; file.Write(bom , sizeof(bom), processedSize); } file.Write(utfString, utfString.Length(), processedSize); _commentsAreLoaded = false; return true; }
HRESULT CCopyStateIO::MyCopyFile(CFSTR inPath, CFSTR outPath, DWORD attrib) { ErrorFileIndex = -1; ErrorMessage.Empty(); CurrentSize = 0; { const size_t kBufSize = 1 << 16; CByteArr buf(kBufSize); NIO::CInFile inFile; NIO::COutFile outFile; if (!inFile.Open(inPath)) { ErrorFileIndex = 0; return S_OK; } if (!outFile.Create(outPath, true)) { ErrorFileIndex = 1; return S_OK; } for (;;) { UInt32 num; if (!inFile.Read(buf, kBufSize, num)) { ErrorFileIndex = 0; return S_OK; } if (num == 0) break; UInt32 written = 0; if (!outFile.Write(buf, num, written)) { ErrorFileIndex = 1; return S_OK; } if (written != num) { ErrorMessage = "Write error"; return S_OK; } CurrentSize += num; if (Progress) { UInt64 completed = StartPos + CurrentSize; RINOK(Progress->SetCompleted(&completed)); } } } if (attrib != INVALID_FILE_ATTRIBUTES) SetFileAttrib(outPath, attrib); if (DeleteSrcFile) { if (!DeleteFileAlways(inPath)) { ErrorFileIndex = 0; return S_OK; } } return S_OK; }
bool Write(const void *data, UInt32 size, UInt32 &processedSize) throw() { bool res = File.Write(data, size, processedSize); Written += processedSize; return res; }
HRESULT CThreadSplit::ProcessVirt() { NIO::CInFile inFile; if (!inFile.Open(FilePath)) return GetLastError(); NIO::COutFile outFile; CMyBuffer bufferObject; if (!bufferObject.Allocate(kBufSize)) return E_OUTOFMEMORY; Byte *buffer = (Byte *)(void *)bufferObject; UInt64 curVolSize = 0; CVolSeqName seqName; seqName.SetNumDigits(NumVolumes); UInt64 length; if (!inFile.GetLength(length)) return GetLastError(); CProgressSync &sync = ProgressDialog.Sync; sync.Set_NumBytesTotal(length); UInt64 pos = 0; UInt64 numFiles = 0; unsigned volIndex = 0; for (;;) { UInt64 volSize; if (volIndex < VolumeSizes.Size()) volSize = VolumeSizes[volIndex]; else volSize = VolumeSizes.Back(); UInt32 needSize = (UInt32)(MyMin((UInt64)kBufSize, volSize - curVolSize)); UInt32 processedSize; if (!inFile.Read(buffer, needSize, processedSize)) return GetLastError(); if (processedSize == 0) break; needSize = processedSize; if (curVolSize == 0) { FString name = VolBasePath; name += FTEXT('.'); name += us2fs(seqName.GetNextName()); sync.Set_FilePath(fs2us(name)); sync.Set_NumFilesCur(numFiles++); if (!outFile.Create(name, false)) { HRESULT res = GetLastError(); AddErrorPath(name); return res; } } if (!outFile.Write(buffer, needSize, processedSize)) return GetLastError(); if (needSize != processedSize) throw g_Message_FileWriteError; curVolSize += processedSize; if (curVolSize == volSize) { outFile.Close(); if (volIndex < VolumeSizes.Size()) volIndex++; curVolSize = 0; } pos += processedSize; RINOK(sync.Set_NumBytesCur(pos)); } sync.Set_NumFilesCur(numFiles); return S_OK; }