Index: src/wp-admin/includes/file.php
===================================================================
--- src/wp-admin/includes/file.php	(revision 43177)
+++ src/wp-admin/includes/file.php	(working copy)
@@ -2129,10 +2129,27 @@
 
 	// Now, generate the ZIP.
 	$error            = false;
-	$archive_filename = $file_basename . '.zip';
-	$archive_pathname = $exports_dir . $archive_filename;
-	$archive_url      = $exports_url . $archive_filename;
+	// If we already have a path for the archive from a previous export for
+	// this request, delete the old archive and use that filename again to create
+	// the new one.
+	$archive_url      = get_post_meta( $request_id, '_export_file_url', true );
+	$archive_pathname = get_post_meta( $request_id, '_export_file_path', true );
 
+	if ( empty( $archive_pathname ) || empty( $archive_url ) ) {
+		$archive_filename = $file_basename . '.zip';
+		$archive_pathname = $exports_dir . $archive_filename;
+		$archive_url      = $exports_url . $archive_filename;
+
+		// Save the url and path in the request.
+		update_post_meta( $request_id, '_export_file_url', $archive_url );
+		update_post_meta( $request_id, '_export_file_path', $archive_pathname );
+	}
+
+	// If the archive already exists, remove it so we can build it afresh
+	if ( ! empty( $archive_pathname ) && file_exists( $archive_pathname ) ) {
+			wp_delete_file( $archive_pathname );
+	}
+
 	$zip = new ZipArchive;
 	if ( true === $zip->open( $archive_pathname, ZipArchive::CREATE ) ) {
 		if ( ! $zip->addFile( $html_report_pathname, 'index.html' ) ) {
@@ -2158,15 +2175,11 @@
 	}
 
 	// And remove the HTML file.
-	unlink( $html_report_pathname );
+	wp_delete_file( $html_report_pathname );
 
 	if ( $error ) {
 		wp_send_json_error( $error );
 	}
-
-	// Save the export file in the request.
-	update_post_meta( $request_id, '_export_file_url', $archive_url );
-	update_post_meta( $request_id, '_export_file_path', $archive_pathname );
 }
 
 /**
@@ -2342,14 +2355,6 @@
 	delete_post_meta( $request_id, '_export_data_raw' );
 	update_post_meta( $request_id, '_export_data_grouped', $groups );
 
-	// And now, generate the export file, cleaning up any previous file
-	$export_path = get_post_meta( $request_id, '_export_file_path', true );
-	if ( ! empty( $export_path ) ) {
-		delete_post_meta( $request_id, '_export_file_path' );
-		@unlink( $export_path );
-	}
-	delete_post_meta( $request_id, '_export_file_url' );
-
 	// Generate the export file from the collected, grouped personal data.
 	do_action( 'wp_privacy_personal_data_export_file', $request_id );
 
