/** This is not called in bulk_extractor */ void File::Write(const void *Data,size_t Size) { //This is not called in bulk_extractor if (Size==0) return; #ifndef _WIN_CE if (HandleType!=FILE_HANDLENORMAL) switch(HandleType) { case FILE_HANDLESTD: #ifdef _WIN_ALL hFile=GetStdHandle(STD_OUTPUT_HANDLE); #else hFile=stdout; #endif break; case FILE_HANDLEERR: #ifdef _WIN_ALL hFile=GetStdHandle(STD_ERROR_HANDLE); #else hFile=stderr; #endif break; } #endif while (1) { bool Success=false; #ifdef _WIN_ALL DWORD Written=0; if (HandleType!=FILE_HANDLENORMAL) { // writing to stdout can fail in old Windows if data block is too large const size_t MaxSize=0x4000; for (size_t I=0;I<Size;I+=MaxSize) { Success=WriteFile(hFile,(byte *)Data+I,(DWORD)Min(Size-I,MaxSize),&Written,NULL)==TRUE; //Writing happens here if (!Success) break; } } else Success=WriteFile(hFile,Data,(DWORD)Size,&Written,NULL)==TRUE; #else int Written=fwrite(Data,1,Size,hFile); Success=Written==Size && !ferror(hFile); #endif if (!Success && AllowExceptions && HandleType==FILE_HANDLENORMAL) { #if defined(_WIN_ALL) && !defined(SFX_MODULE) && !defined(RARDLL) int ErrCode=GetLastError(); int64 FilePos=Tell(); uint64 FreeSize=GetFreeDisk(FileName); SetLastError(ErrCode); if (FreeSize>Size && FilePos-Size<=0xffffffff && FilePos+Size>0xffffffff) ErrHandler.WriteErrorFAT(FileName,FileNameW); #endif if (ErrHandler.AskRepeatWrite(FileName,FileNameW,false)) { #ifndef _WIN_ALL clearerr(hFile); #endif if (Written<Size && Written>0) Seek(Tell()-Written,SEEK_SET); continue; } ErrHandler.WriteError(NULL,NULL,FileName,FileNameW); } break; } LastWrite=true; }
void File::Write(const void *Data,int Size) { /*if (Size==0) return; //#ifndef _WIN_CE #if !defined(_WIN_CE) && !defined(_XBOX) if (HandleType!=FILE_HANDLENORMAL) switch(HandleType) { case FILE_HANDLESTD: #ifdef _WIN_32 hFile=GetStdHandle(STD_OUTPUT_HANDLE); #else hFile=stdout; #endif break; case FILE_HANDLEERR: #ifdef _WIN_32 hFile=GetStdHandle(STD_ERROR_HANDLE); #else hFile=stderr; #endif break; } #endif*/ while (1) { bool success = true; #if defined(_WIN_32) || defined(_LINUX) DWORD Written=0; if (HandleType!=FILE_HANDLENORMAL) { const int MaxSize=0x4000; for (int I=0; I<Size; I+=MaxSize) //if (!(success=WriteFile(hFile,(byte *)Data+I,Min(Size-I,MaxSize),&Written,NULL) != FALSE)) m_File.Write((byte*)Data+I,Min(Size-I,MaxSize)); // break; } else { //success=WriteFile(hFile,Data,Size,&Written,NULL) != FALSE; m_File.Write(Data,Size); } #else success=fwrite(Data,1,Size,hFile)==Size && !ferror(hFile); #endif if (!success && AllowExceptions && HandleType==FILE_HANDLENORMAL) { #if defined(_WIN_32) && !defined(SFX_MODULE) && !defined(RARDLL) int ErrCode=GetLastError(); Int64 FilePos=Tell(); Int64 FreeSize=GetFreeDisk(FileName); SetLastError(ErrCode); if (FreeSize>Size && FilePos-Size<=0xffffffff && FilePos+Size>0xffffffff) ErrHandler.WriteErrorFAT(FileName); #endif if (ErrHandler.AskRepeatWrite(FileName)) { #if !defined(_WIN_32) && !defined(_LINUX) clearerr(hFile); #endif if (Written<(unsigned int)Size && Written>0) Seek(Tell()-Written,SEEK_SET); continue; } ErrHandler.WriteError(NULL,FileName); } break; } LastWrite=true; }
void File::Write(const void *Data,int Size) { if (Size==0) return; #ifndef _WIN_CE if (HandleType!=FILE_HANDLENORMAL) switch(HandleType) { case FILE_HANDLESTD: #ifdef _WIN_32 hFile=GetStdHandle(STD_OUTPUT_HANDLE); #else hFile=stdout; #endif break; case FILE_HANDLEERR: #ifdef _WIN_32 hFile=GetStdHandle(STD_ERROR_HANDLE); #else hFile=stderr; #endif break; } #endif while (1) { bool Success; #ifdef _WIN_32 DWORD Written; if (HandleType!=FILE_HANDLENORMAL) { const int MaxSize=0x4000; for (int I=0;I<Size;I+=MaxSize) if (!(Success=WriteFile(hFile,(byte *)Data+I,Min(Size-I,MaxSize),&Written,NULL))) break; } else Success=WriteFile(hFile,Data,Size,&Written,NULL); #else Success=fwrite(Data,1,Size,hFile)==Size && !ferror(hFile); #endif if (!Success && AllowExceptions && HandleType==FILE_HANDLENORMAL) { #if defined(_WIN_32) && !defined(SFX_MODULE) && !defined(RARDLL) int ErrCode=GetLastError(); Int64 FilePos=Tell(); Int64 FreeSize=GetFreeDisk(FileName); SetLastError(ErrCode); if (FreeSize>Size && FilePos-Size<=0xffffffff && FilePos+Size>0xffffffff) ErrHandler.WriteErrorFAT(FileName); #endif if (ErrHandler.AskRepeatWrite(FileName)) { #ifndef _WIN_32 clearerr(hFile); #endif continue; } ErrHandler.WriteError(NULL,FileName); } break; } LastWrite=true; }