def __init__( self, src: AbsolutePath, dst: AbsolutePath, *, buffer_size: int = 0, notifier: Notifier = DEFAULT_NOTIFIER, notify_end: bool = True, ): src = AbsolutePath.ensure(src) dst = AbsolutePath.ensure(dst) buffer_size = buffer_size or 32 * 1024 * 1024 assert buffer_size > 0 if not src.isfile(): raise core_exceptions.NotAFileError(src) if dst.exists(): raise FileExistsError(dst) dst_dir = dst.get_directory() if not dst_dir.isdir(): raise NotADirectoryError(dst_dir) disk_usage = shutil.disk_usage(dst_dir.path) total = src.get_size() if total >= disk_usage.free: raise core_exceptions.DiskSpaceError(total, disk_usage.free) self.src = src self.dst = dst self.total = total self.buffer_size = buffer_size self.notifier = notifier self.cancel = False self.notify_end = notify_end
def flush_json_data( data: object, previous_file_path: AbsolutePath, target_file_path: AbsolutePath, next_file_path: AbsolutePath, ): # Store JSON data to next file with open(next_file_path.path, "w") as output_file: json.dump(data, output_file) # Remove previous file previous_file_path.delete() # Move target file to previous file if target_file_path.isfile(): FileSystem.rename(target_file_path.path, previous_file_path.path) assert not target_file_path.isfile() assert previous_file_path.isfile() # Move next file to target file FileSystem.rename(next_file_path.path, target_file_path.path) # Next file deleted # Previous file may exists # Target file contains data assert not next_file_path.exists() assert target_file_path.isfile()