diff --git a/BeefLibs/corlib/src/IO/FileStream.bf b/BeefLibs/corlib/src/IO/FileStream.bf index 287de4fa..9df7f8a3 100644 --- a/BeefLibs/corlib/src/IO/FileStream.bf +++ b/BeefLibs/corlib/src/IO/FileStream.bf @@ -235,6 +235,32 @@ namespace System.IO return .Err; return .Ok; } + + public override Result SetLength(int64 length) + { + int64 pos = Position; + + if (pos != length) + Seek(length); + + Platform.BfpFileResult result = .Ok; + Platform.BfpFile_Truncate(mBfpFile, &result); + if (result != .Ok) + { + Seek(pos); + return .Err; + } + + if (pos != length) + { + if (pos < length) + Seek(pos); + else + Seek(0, .FromEnd); + } + + return .Ok; + } } class BufferedFileStream : BufferedStream @@ -452,6 +478,40 @@ namespace System.IO return .Err; return numBytesRead; } + + public override Result SetLength(int64 length) + { + Try!(Flush()); + + int64 pos = Position; + + if (pos != length || pos != mBfpFilePos) + { + Try!(SeekUnderlying(length)); + mPos = length; + } + + Platform.BfpFileResult result = .Ok; + Platform.BfpFile_Truncate(mBfpFile, &result); + if (result != .Ok) + { + Try!(SeekUnderlying(pos)); + return .Err; + } + + mUnderlyingLength = length; + mPos = Math.Min(pos, Length); + + if (pos != length) + { + if (pos < length) + Try!(SeekUnderlying(pos)); + else + Try!(SeekUnderlying(0, .FromEnd)); + } + + return .Ok; + } } class FileStream : BufferedFileStream diff --git a/BeefLibs/corlib/src/IO/Stream.bf b/BeefLibs/corlib/src/IO/Stream.bf index 00e8bab5..404a5d8b 100644 --- a/BeefLibs/corlib/src/IO/Stream.bf +++ b/BeefLibs/corlib/src/IO/Stream.bf @@ -203,6 +203,11 @@ namespace System.IO return .Ok; } + public virtual Result SetLength(int64 length) + { + return .Err; + } + public void Align(int alignSize) { int64 pos = Length; diff --git a/BeefLibs/corlib/src/Platform.bf b/BeefLibs/corlib/src/Platform.bf index 068c0dc0..f110c709 100644 --- a/BeefLibs/corlib/src/Platform.bf +++ b/BeefLibs/corlib/src/Platform.bf @@ -352,7 +352,7 @@ namespace System [CallingConvention(.Stdcall), CLink] public static extern int64 BfpFile_Seek(BfpFile* file, int64 offset, BfpFileSeekKind seekKind); [CallingConvention(.Stdcall), CLink] - public static extern void BfpFile_Truncate(BfpFile* file); + public static extern void BfpFile_Truncate(BfpFile* file, BfpFileResult* outResult); [CallingConvention(.Stdcall), CLink] public static extern BfpTimeStamp BfpFile_GetTime_LastWrite(char8* path); [CallingConvention(.Stdcall), CLink] diff --git a/BeefySysLib/FileStream.cpp b/BeefySysLib/FileStream.cpp index 1e850d76..08ee6f3d 100644 --- a/BeefySysLib/FileStream.cpp +++ b/BeefySysLib/FileStream.cpp @@ -219,7 +219,8 @@ void SysFileStream::SetSizeFast(int size) int curPos = GetPos(); SetPos(size); - BfpFile_Truncate(mFile); + BfpFileResult result = BfpFileResult_Ok; + BfpFile_Truncate(mFile, &result); SetPos(curPos); return; } diff --git a/BeefySysLib/platform/PlatformInterface.h b/BeefySysLib/platform/PlatformInterface.h index c8434563..79b08843 100644 --- a/BeefySysLib/platform/PlatformInterface.h +++ b/BeefySysLib/platform/PlatformInterface.h @@ -422,7 +422,7 @@ BFP_EXPORT intptr BFP_CALLTYPE BfpFile_Read(BfpFile* file, void* buffer, intptr BFP_EXPORT void BFP_CALLTYPE BfpFile_Flush(BfpFile* file); BFP_EXPORT int64 BFP_CALLTYPE BfpFile_GetFileSize(BfpFile* file); BFP_EXPORT int64 BFP_CALLTYPE BfpFile_Seek(BfpFile* file, int64 offset, BfpFileSeekKind seekKind); -BFP_EXPORT void BFP_CALLTYPE BfpFile_Truncate(BfpFile* file); +BFP_EXPORT void BFP_CALLTYPE BfpFile_Truncate(BfpFile* file, BfpFileResult* outResult); BFP_EXPORT BfpTimeStamp BFP_CALLTYPE BfpFile_GetTime_LastWrite(const char* path); BFP_EXPORT BfpFileAttributes BFP_CALLTYPE BfpFile_GetAttributes(const char* path, BfpFileResult* outResult); BFP_EXPORT void BFP_CALLTYPE BfpFile_SetAttributes(const char* path, BfpFileAttributes attribs, BfpFileResult* outResult); diff --git a/BeefySysLib/platform/posix/PosixCommon.cpp b/BeefySysLib/platform/posix/PosixCommon.cpp index 910703e4..9e55deda 100644 --- a/BeefySysLib/platform/posix/PosixCommon.cpp +++ b/BeefySysLib/platform/posix/PosixCommon.cpp @@ -2083,13 +2083,15 @@ BFP_EXPORT int64 BFP_CALLTYPE BfpFile_Seek(BfpFile* file, int64 offset, BfpFileS return lseek64(file->mHandle, offset, whence); } -BFP_EXPORT void BFP_CALLTYPE BfpFile_Truncate(BfpFile* file) +BFP_EXPORT void BFP_CALLTYPE BfpFile_Truncate(BfpFile* file, BfpFileResult* outResult) { int64 curPos = (int64)lseek64(file->mHandle, 0, SEEK_CUR); if (ftruncate64(file->mHandle, curPos) != 0) - { - //TODO: Report error? - } + { + OUTRESULT(BfpFileResult_UnknownError); + return; + } + OUTRESULT(BfpFileResult_Ok); } BFP_EXPORT BfpTimeStamp BFP_CALLTYPE BfpFile_GetTime_LastWrite(const char* path) diff --git a/BeefySysLib/platform/win/Platform.cpp b/BeefySysLib/platform/win/Platform.cpp index de943727..e8a91d1e 100644 --- a/BeefySysLib/platform/win/Platform.cpp +++ b/BeefySysLib/platform/win/Platform.cpp @@ -3023,9 +3023,14 @@ BFP_EXPORT int64 BFP_CALLTYPE BfpFile_Seek(BfpFile* file, int64 offset, BfpFileS return newPos.QuadPart; } -BFP_EXPORT void BFP_CALLTYPE BfpFile_Truncate(BfpFile* file) +BFP_EXPORT void BFP_CALLTYPE BfpFile_Truncate(BfpFile* file, BfpFileResult* outResult) { - SetEndOfFile(file->mHandle); + if (!SetEndOfFile(file->mHandle)) + { + OUTRESULT(BfpFileResult_UnknownError); + return; + } + OUTRESULT(BfpFileResult_Ok); } BFP_EXPORT BfpTimeStamp BFP_CALLTYPE BfpFile_GetTime_LastWrite(const char* path) diff --git a/IDE/mintest/minlib/src/System/Platform.bf b/IDE/mintest/minlib/src/System/Platform.bf index 217ff2a7..35a72d33 100644 --- a/IDE/mintest/minlib/src/System/Platform.bf +++ b/IDE/mintest/minlib/src/System/Platform.bf @@ -304,7 +304,7 @@ namespace System [CallingConvention(.Stdcall), CLink] public static extern int64 BfpFile_Seek(BfpFile* file, int64 offset, BfpFileSeekKind seekKind); [CallingConvention(.Stdcall), CLink] - public static extern void BfpFile_Truncate(BfpFile* file); + public static extern void BfpFile_Truncate(BfpFile* file, BfpFileResult* outResult); [CallingConvention(.Stdcall), CLink] public static extern BfpTimeStamp BfpFile_GetTime_LastWrite(char8* path); [CallingConvention(.Stdcall), CLink]