@@ -330,12 +330,12 @@ export class FileService extends Disposable implements IFileService {
330330
331331 // write file: unbuffered (only if data to write is a buffer, or the provider has no buffered write capability)
332332 if ( ! hasOpenReadWriteCloseCapability ( provider ) || ( hasReadWriteCapability ( provider ) && bufferOrReadableOrStream instanceof VSBuffer ) ) {
333- await this . doWriteUnbuffered ( provider , resource , bufferOrReadableOrStream ) ;
333+ await this . doWriteUnbuffered ( provider , resource , bufferOrReadableOrStream , options ) ;
334334 }
335335
336336 // write file: buffered
337337 else {
338- await this . doWriteBuffered ( provider , resource , bufferOrReadableOrStream instanceof VSBuffer ? bufferToReadable ( bufferOrReadableOrStream ) : bufferOrReadableOrStream ) ;
338+ await this . doWriteBuffered ( provider , resource , bufferOrReadableOrStream instanceof VSBuffer ? bufferToReadable ( bufferOrReadableOrStream ) : bufferOrReadableOrStream , options ) ;
339339 }
340340 } catch ( error ) {
341341 throw new FileOperationError ( localize ( 'err.write' , "Unable to write file '{0}' ({1})" , this . resourceForError ( resource ) , ensureFileSystemProviderError ( error ) . toString ( ) ) , toFileOperationResult ( error ) , options ) ;
@@ -953,7 +953,7 @@ export class FileService extends Disposable implements IFileService {
953953 return isPathCaseSensitive ? resource . toString ( ) : resource . toString ( ) . toLowerCase ( ) ;
954954 }
955955
956- private async doWriteBuffered ( provider : IFileSystemProviderWithOpenReadWriteCloseCapability , resource : URI , readableOrStream : VSBufferReadable | VSBufferReadableStream ) : Promise < void > {
956+ private async doWriteBuffered ( provider : IFileSystemProviderWithOpenReadWriteCloseCapability , resource : URI , readableOrStream : VSBufferReadable | VSBufferReadableStream , options ?: IWriteFileOptions ) : Promise < void > {
957957 return this . ensureWriteQueue ( provider , resource ) . queue ( async ( ) => {
958958
959959 // open handle
@@ -962,9 +962,9 @@ export class FileService extends Disposable implements IFileService {
962962 // write into handle until all bytes from buffer have been written
963963 try {
964964 if ( isReadableStream ( readableOrStream ) ) {
965- await this . doWriteStreamBufferedQueued ( provider , handle , readableOrStream ) ;
965+ await this . doWriteStreamBufferedQueued ( provider , handle , readableOrStream , options ) ;
966966 } else {
967- await this . doWriteReadableBufferedQueued ( provider , handle , readableOrStream ) ;
967+ await this . doWriteReadableBufferedQueued ( provider , handle , readableOrStream , options ) ;
968968 }
969969 } catch ( error ) {
970970 throw ensureFileSystemProviderError ( error ) ;
@@ -976,7 +976,7 @@ export class FileService extends Disposable implements IFileService {
976976 } ) ;
977977 }
978978
979- private doWriteStreamBufferedQueued ( provider : IFileSystemProviderWithOpenReadWriteCloseCapability , handle : number , stream : VSBufferReadableStream ) : Promise < void > {
979+ private doWriteStreamBufferedQueued ( provider : IFileSystemProviderWithOpenReadWriteCloseCapability , handle : number , stream : VSBufferReadableStream , options ?: IWriteFileOptions ) : Promise < void > {
980980 return new Promise ( ( resolve , reject ) => {
981981 let posInFile = 0 ;
982982
@@ -986,7 +986,7 @@ export class FileService extends Disposable implements IFileService {
986986 stream . pause ( ) ;
987987
988988 try {
989- await this . doWriteBuffer ( provider , handle , chunk , chunk . byteLength , posInFile , 0 ) ;
989+ await this . doWriteBuffer ( provider , handle , chunk , chunk . byteLength , posInFile , 0 , options ) ;
990990 } catch ( error ) {
991991 return reject ( error ) ;
992992 }
@@ -1005,30 +1005,35 @@ export class FileService extends Disposable implements IFileService {
10051005 } ) ;
10061006 }
10071007
1008- private async doWriteReadableBufferedQueued ( provider : IFileSystemProviderWithOpenReadWriteCloseCapability , handle : number , readable : VSBufferReadable ) : Promise < void > {
1008+ private async doWriteReadableBufferedQueued ( provider : IFileSystemProviderWithOpenReadWriteCloseCapability , handle : number , readable : VSBufferReadable , options ?: IWriteFileOptions ) : Promise < void > {
10091009 let posInFile = 0 ;
10101010
10111011 let chunk : VSBuffer | null ;
10121012 while ( ( chunk = readable . read ( ) ) !== null ) {
1013- await this . doWriteBuffer ( provider , handle , chunk , chunk . byteLength , posInFile , 0 ) ;
1013+ await this . doWriteBuffer ( provider , handle , chunk , chunk . byteLength , posInFile , 0 , options ) ;
10141014
10151015 posInFile += chunk . byteLength ;
10161016 }
10171017 }
10181018
1019- private async doWriteBuffer ( provider : IFileSystemProviderWithOpenReadWriteCloseCapability , handle : number , buffer : VSBuffer , length : number , posInFile : number , posInBuffer : number ) : Promise < void > {
1019+ private async doWriteBuffer ( provider : IFileSystemProviderWithOpenReadWriteCloseCapability , handle : number , buffer : VSBuffer , length : number , posInFile : number , posInBuffer : number , options ?: IWriteFileOptions ) : Promise < void > {
10201020 let totalBytesWritten = 0 ;
10211021 while ( totalBytesWritten < length ) {
1022+
1023+ // Write through the provider
10221024 const bytesWritten = await provider . write ( handle , posInFile + totalBytesWritten , buffer . buffer , posInBuffer + totalBytesWritten , length - totalBytesWritten ) ;
10231025 totalBytesWritten += bytesWritten ;
1026+
1027+ // report progress as needed
1028+ options ?. progress ?.( bytesWritten ) ;
10241029 }
10251030 }
10261031
1027- private async doWriteUnbuffered ( provider : IFileSystemProviderWithFileReadWriteCapability , resource : URI , bufferOrReadableOrStream : VSBuffer | VSBufferReadable | VSBufferReadableStream ) : Promise < void > {
1028- return this . ensureWriteQueue ( provider , resource ) . queue ( ( ) => this . doWriteUnbufferedQueued ( provider , resource , bufferOrReadableOrStream ) ) ;
1032+ private async doWriteUnbuffered ( provider : IFileSystemProviderWithFileReadWriteCapability , resource : URI , bufferOrReadableOrStream : VSBuffer | VSBufferReadable | VSBufferReadableStream , options ?: IWriteFileOptions ) : Promise < void > {
1033+ return this . ensureWriteQueue ( provider , resource ) . queue ( ( ) => this . doWriteUnbufferedQueued ( provider , resource , bufferOrReadableOrStream , options ) ) ;
10291034 }
10301035
1031- private async doWriteUnbufferedQueued ( provider : IFileSystemProviderWithFileReadWriteCapability , resource : URI , bufferOrReadableOrStream : VSBuffer | VSBufferReadable | VSBufferReadableStream ) : Promise < void > {
1036+ private async doWriteUnbufferedQueued ( provider : IFileSystemProviderWithFileReadWriteCapability , resource : URI , bufferOrReadableOrStream : VSBuffer | VSBufferReadable | VSBufferReadableStream , options ?: IWriteFileOptions ) : Promise < void > {
10321037 let buffer : VSBuffer ;
10331038 if ( bufferOrReadableOrStream instanceof VSBuffer ) {
10341039 buffer = bufferOrReadableOrStream ;
@@ -1038,7 +1043,11 @@ export class FileService extends Disposable implements IFileService {
10381043 buffer = readableToBuffer ( bufferOrReadableOrStream ) ;
10391044 }
10401045
1041- return provider . writeFile ( resource , buffer . buffer , { create : true , overwrite : true } ) ;
1046+ // Write through the provider
1047+ await provider . writeFile ( resource , buffer . buffer , { create : true , overwrite : true } ) ;
1048+
1049+ // Report progress as needed
1050+ options ?. progress ?.( buffer . byteLength ) ;
10421051 }
10431052
10441053 private async doPipeBuffered ( sourceProvider : IFileSystemProviderWithOpenReadWriteCloseCapability , source : URI , targetProvider : IFileSystemProviderWithOpenReadWriteCloseCapability , target : URI ) : Promise < void > {
0 commit comments