处理windows合并文件异常问题

This commit is contained in:
kura 2026-05-07 17:52:16 +08:00
parent 4110687e02
commit b90c695207
2 changed files with 27 additions and 19 deletions

View File

@ -1,4 +1,4 @@
import { type DataConnection } from "peerjs"; import type { DataConnection } from "peerjs";
import { FileTransfer, TransferStatus, TransferTask } from "./fileTransfer"; import { FileTransfer, TransferStatus, TransferTask } from "./fileTransfer";
import { peer } from "./peer"; import { peer } from "./peer";
import { MessageType } from "./peer"; import { MessageType } from "./peer";
@ -327,14 +327,12 @@ export class FileInfo {
} }
if (offset > 0) { if (offset > 0) {
const fileHandler = await dir.getFileHandle(name, { create: true }); const fileHandler = await dir.getFileHandle(name, { create: true });
const arrayBuffer = await (await fileHandler.getFile()).arrayBuffer(); const writable = await fileHandler.createWritable({ keepExistingData: true });
const newSize = buffer.byteLength + offset; await writable.write({
const newArrayBuffer = arrayBuffer.byteLength >= newSize ? new Uint8Array(arrayBuffer.byteLength) : new Uint8Array(newSize); type: 'write',
newArrayBuffer.set(new Uint8Array(arrayBuffer), 0); position: offset,
newArrayBuffer.set(new Uint8Array(buffer), offset); data: buffer,
});
const writable = await fileHandler.createWritable();
await writable.write(newArrayBuffer);
await writable.close(); await writable.close();
} else { } else {
@ -365,15 +363,12 @@ export class FileInfo {
}) })
} else { } else {
if (offset > 0) { if (offset > 0) {
const file = await (this.fileDirHandler as FileSystemFileHandle).getFile(); const writable = await (this.fileDirHandler as FileSystemFileHandle).createWritable({ keepExistingData: true });
const arrayBuffer = await file.arrayBuffer(); await writable.write({
const newSize = buffer.byteLength + offset; type: 'write',
const newArrayBuffer = arrayBuffer.byteLength >= newSize ? new Uint8Array(arrayBuffer.byteLength) : new Uint8Array(newSize); position: offset,
newArrayBuffer.set(new Uint8Array(arrayBuffer), 0); data: buffer,
newArrayBuffer.set(new Uint8Array(buffer), offset); });
const writable = await (this.fileDirHandler as FileSystemFileHandle).createWritable();
await writable.write(newArrayBuffer);
await writable.close(); await writable.close();
} else { } else {
const writable = await (this.fileDirHandler as FileSystemFileHandle).createWritable(); const writable = await (this.fileDirHandler as FileSystemFileHandle).createWritable();
@ -514,4 +509,4 @@ export interface FileData {
totalSize: number; totalSize: number;
buffer: ArrayBuffer; buffer: ArrayBuffer;
} }
} }

View File

@ -80,6 +80,7 @@ export class FileTransfer {
this.pausePromise = undefined; this.pausePromise = undefined;
this.pauseResolve = undefined; this.pauseResolve = undefined;
this.aborted = false; this.aborted = false;
this.receiveQueue = Promise.resolve();
} }
// 设置进度回调 // 设置进度回调
@ -117,6 +118,7 @@ export class FileTransfer {
public offset: number = 0; public offset: number = 0;
public totalSize: number = 0; public totalSize: number = 0;
private fileBuffer: ArrayBuffer | null = null; private fileBuffer: ArrayBuffer | null = null;
private receiveQueue: Promise<void> = Promise.resolve();
private async waitForWritable(targetBufferedAmount = MAX_BUFFERED_AMOUNT) { private async waitForWritable(targetBufferedAmount = MAX_BUFFERED_AMOUNT) {
const dc = this.conn.dataChannel; const dc = this.conn.dataChannel;
if (!dc) { if (!dc) {
@ -222,6 +224,17 @@ export class FileTransfer {
public async receiveFile( public async receiveFile(
fData: FileData, fData: FileData,
preView: boolean = false, preView: boolean = false,
): Promise<void> {
this.receiveQueue = this.receiveQueue.then(
() => this.receiveFileChunk(fData, preView),
() => this.receiveFileChunk(fData, preView),
);
return this.receiveQueue;
}
private async receiveFileChunk(
fData: FileData,
preView: boolean = false,
): Promise<void> { ): Promise<void> {
try { try {
let task = this.getTask(fData); let task = this.getTask(fData);