Then don't do that part, allocate at the end and only rewrite existing blocks rather than deleting them. It's like how just because you can't easily sbrk(2) new memory before at the beginning of a heap doesn't mean you can't have multiple threads despite that being the resource you're contending.
So like how the OS pretends filesystems are in a tape, the filesystem pretends that the files are in a tape.
And tape splicer is optional with a not-standard interface (logical volume management, fallocate, etc).