소스 검색

Implement FileStream SetLength

disarray2077 4 년 전
부모
커밋
06fe5a98c6

+ 60 - 0
BeefLibs/corlib/src/IO/FileStream.bf

@@ -235,6 +235,32 @@ namespace System.IO
 				return .Err;
 			return .Ok;
 		}
+
+		public override Result<void> 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<void> 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

+ 5 - 0
BeefLibs/corlib/src/IO/Stream.bf

@@ -203,6 +203,11 @@ namespace System.IO
 			return .Ok;
 		}
 
+		public virtual Result<void> SetLength(int64 length)
+		{
+			return .Err;
+		}
+
 		public void Align(int alignSize)
 		{
 			int64 pos = Length;

+ 1 - 1
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]

+ 2 - 1
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;	
 }

+ 1 - 1
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);

+ 6 - 4
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)

+ 7 - 2
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)

+ 1 - 1
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]