private Result WriteFile(ReadOnlySpan <byte> data) { Debug.Assert(FsClient != null); Debug.Assert(!string.IsNullOrWhiteSpace(FileName)); FsClient.DeleteFile(FileName); Result rc = FsClient.CreateFile(FileName, data.Length); if (rc.IsFailure()) { return(rc); } rc = FsClient.OpenFile(out FileHandle handle, FileName, OpenMode.Write); if (rc.IsFailure()) { return(rc); } rc = FsClient.WriteFile(handle, 0, data, WriteOption.Flush); FsClient.CloseFile(handle); return(rc); }
protected override void Dispose(bool disposing) { if (CloseHandle) { FsClient.CloseFile(Handle); } }
private Result ReadFile(out byte[] data) { Debug.Assert(FsClient != null); Debug.Assert(!string.IsNullOrWhiteSpace(FileName)); data = default; Result rc = FsClient.OpenFile(out FileHandle handle, FileName, OpenMode.Read); if (rc.IsFailure()) { return(rc); } rc = FsClient.GetFileSize(out long fileSize, handle); if (rc.IsSuccess()) { data = new byte[fileSize]; rc = FsClient.ReadFile(handle, 0, data); } FsClient.CloseFile(handle); return(rc); }
public Result Commit() { lock (Locker) { Result rc = Initialize(); if (rc.IsFailure()) { return(rc); } rc = EnsureKvDatabaseLoaded(false); if (rc.IsFailure()) { return(rc); } var mount = new Mounter(); try { rc = mount.Initialize(FsClient, MountName, SpaceId, SaveDataId); if (rc.IsFailure()) { return(rc); } rc = KvDatabase.WriteDatabaseToFile(); if (rc.IsFailure()) { return(rc); } string idFilePath = $"{MountName}:/{LastIdFileName}"; rc = FsClient.OpenFile(out FileHandle handle, idFilePath, OpenMode.Write); if (rc.IsFailure()) { return(rc); } bool fileAlreadyClosed = false; try { ulong lastId = LastPublishedId; rc = FsClient.WriteFile(handle, 0, SpanHelpers.AsByteSpan(ref lastId), WriteOption.None); if (rc.IsFailure()) { return(rc); } rc = FsClient.FlushFile(handle); if (rc.IsFailure()) { return(rc); } FsClient.CloseFile(handle); fileAlreadyClosed = true; return(FsClient.Commit(MountName)); } finally { if (!fileAlreadyClosed) { FsClient.CloseFile(handle); } } } finally { mount.Dispose(); } } }