mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 11:38:21 +02:00
Implement FileStream SetLength
This commit is contained in:
parent
4bd3cc641d
commit
06fe5a98c6
8 changed files with 83 additions and 10 deletions
|
@ -235,6 +235,32 @@ namespace System.IO
|
||||||
return .Err;
|
return .Err;
|
||||||
return .Ok;
|
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
|
class BufferedFileStream : BufferedStream
|
||||||
|
@ -452,6 +478,40 @@ namespace System.IO
|
||||||
return .Err;
|
return .Err;
|
||||||
return numBytesRead;
|
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
|
class FileStream : BufferedFileStream
|
||||||
|
|
|
@ -203,6 +203,11 @@ namespace System.IO
|
||||||
return .Ok;
|
return .Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual Result<void> SetLength(int64 length)
|
||||||
|
{
|
||||||
|
return .Err;
|
||||||
|
}
|
||||||
|
|
||||||
public void Align(int alignSize)
|
public void Align(int alignSize)
|
||||||
{
|
{
|
||||||
int64 pos = Length;
|
int64 pos = Length;
|
||||||
|
|
|
@ -352,7 +352,7 @@ namespace System
|
||||||
[CallingConvention(.Stdcall), CLink]
|
[CallingConvention(.Stdcall), CLink]
|
||||||
public static extern int64 BfpFile_Seek(BfpFile* file, int64 offset, BfpFileSeekKind seekKind);
|
public static extern int64 BfpFile_Seek(BfpFile* file, int64 offset, BfpFileSeekKind seekKind);
|
||||||
[CallingConvention(.Stdcall), CLink]
|
[CallingConvention(.Stdcall), CLink]
|
||||||
public static extern void BfpFile_Truncate(BfpFile* file);
|
public static extern void BfpFile_Truncate(BfpFile* file, BfpFileResult* outResult);
|
||||||
[CallingConvention(.Stdcall), CLink]
|
[CallingConvention(.Stdcall), CLink]
|
||||||
public static extern BfpTimeStamp BfpFile_GetTime_LastWrite(char8* path);
|
public static extern BfpTimeStamp BfpFile_GetTime_LastWrite(char8* path);
|
||||||
[CallingConvention(.Stdcall), CLink]
|
[CallingConvention(.Stdcall), CLink]
|
||||||
|
|
|
@ -219,7 +219,8 @@ void SysFileStream::SetSizeFast(int size)
|
||||||
|
|
||||||
int curPos = GetPos();
|
int curPos = GetPos();
|
||||||
SetPos(size);
|
SetPos(size);
|
||||||
BfpFile_Truncate(mFile);
|
BfpFileResult result = BfpFileResult_Ok;
|
||||||
|
BfpFile_Truncate(mFile, &result);
|
||||||
SetPos(curPos);
|
SetPos(curPos);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 void BFP_CALLTYPE BfpFile_Flush(BfpFile* file);
|
||||||
BFP_EXPORT int64 BFP_CALLTYPE BfpFile_GetFileSize(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 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 BfpTimeStamp BFP_CALLTYPE BfpFile_GetTime_LastWrite(const char* path);
|
||||||
BFP_EXPORT BfpFileAttributes BFP_CALLTYPE BfpFile_GetAttributes(const char* path, BfpFileResult* outResult);
|
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);
|
BFP_EXPORT void BFP_CALLTYPE BfpFile_SetAttributes(const char* path, BfpFileAttributes attribs, BfpFileResult* outResult);
|
||||||
|
|
|
@ -2083,13 +2083,15 @@ BFP_EXPORT int64 BFP_CALLTYPE BfpFile_Seek(BfpFile* file, int64 offset, BfpFileS
|
||||||
return lseek64(file->mHandle, offset, whence);
|
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);
|
int64 curPos = (int64)lseek64(file->mHandle, 0, SEEK_CUR);
|
||||||
if (ftruncate64(file->mHandle, curPos) != 0)
|
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)
|
BFP_EXPORT BfpTimeStamp BFP_CALLTYPE BfpFile_GetTime_LastWrite(const char* path)
|
||||||
|
|
|
@ -3023,9 +3023,14 @@ BFP_EXPORT int64 BFP_CALLTYPE BfpFile_Seek(BfpFile* file, int64 offset, BfpFileS
|
||||||
return newPos.QuadPart;
|
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)
|
BFP_EXPORT BfpTimeStamp BFP_CALLTYPE BfpFile_GetTime_LastWrite(const char* path)
|
||||||
|
|
|
@ -304,7 +304,7 @@ namespace System
|
||||||
[CallingConvention(.Stdcall), CLink]
|
[CallingConvention(.Stdcall), CLink]
|
||||||
public static extern int64 BfpFile_Seek(BfpFile* file, int64 offset, BfpFileSeekKind seekKind);
|
public static extern int64 BfpFile_Seek(BfpFile* file, int64 offset, BfpFileSeekKind seekKind);
|
||||||
[CallingConvention(.Stdcall), CLink]
|
[CallingConvention(.Stdcall), CLink]
|
||||||
public static extern void BfpFile_Truncate(BfpFile* file);
|
public static extern void BfpFile_Truncate(BfpFile* file, BfpFileResult* outResult);
|
||||||
[CallingConvention(.Stdcall), CLink]
|
[CallingConvention(.Stdcall), CLink]
|
||||||
public static extern BfpTimeStamp BfpFile_GetTime_LastWrite(char8* path);
|
public static extern BfpTimeStamp BfpFile_GetTime_LastWrite(char8* path);
|
||||||
[CallingConvention(.Stdcall), CLink]
|
[CallingConvention(.Stdcall), CLink]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue