处理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 { peer } from "./peer";
import { MessageType } from "./peer";
@ -327,14 +327,12 @@ export class FileInfo {
}
if (offset > 0) {
const fileHandler = await dir.getFileHandle(name, { create: true });
const arrayBuffer = await (await fileHandler.getFile()).arrayBuffer();
const newSize = buffer.byteLength + offset;
const newArrayBuffer = arrayBuffer.byteLength >= newSize ? new Uint8Array(arrayBuffer.byteLength) : new Uint8Array(newSize);
newArrayBuffer.set(new Uint8Array(arrayBuffer), 0);
newArrayBuffer.set(new Uint8Array(buffer), offset);
const writable = await fileHandler.createWritable();
await writable.write(newArrayBuffer);
const writable = await fileHandler.createWritable({ keepExistingData: true });
await writable.write({
type: 'write',
position: offset,
data: buffer,
});
await writable.close();
} else {
@ -365,15 +363,12 @@ export class FileInfo {
})
} else {
if (offset > 0) {
const file = await (this.fileDirHandler as FileSystemFileHandle).getFile();
const arrayBuffer = await file.arrayBuffer();
const newSize = buffer.byteLength + offset;
const newArrayBuffer = arrayBuffer.byteLength >= newSize ? new Uint8Array(arrayBuffer.byteLength) : new Uint8Array(newSize);
newArrayBuffer.set(new Uint8Array(arrayBuffer), 0);
newArrayBuffer.set(new Uint8Array(buffer), offset);
const writable = await (this.fileDirHandler as FileSystemFileHandle).createWritable();
await writable.write(newArrayBuffer);
const writable = await (this.fileDirHandler as FileSystemFileHandle).createWritable({ keepExistingData: true });
await writable.write({
type: 'write',
position: offset,
data: buffer,
});
await writable.close();
} else {
const writable = await (this.fileDirHandler as FileSystemFileHandle).createWritable();

View File

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