262
return false;
263
}
265
// ignore stat errors here and just proceed trying to write
266
}
268
>
return true; // atomic writing supported
269
>
}
270
271
private async doWriteFileAtomic(resource: URI, tempResource: URI, content: Uint8Array, opts: IFileWriteOptions): Promise<void> {
273
>
// Ensure to create locks for all resources involved
274
>
// since atomic write involves mutiple disk operations
275
>
// and resources.
276
>
277
>
const locks = new DisposableStore();
278
>
279
>
try {
280
>
locks.add(await this.createResourceLock(resource));
281
>
locks.add(await this.createResourceLock(tempResource));
282
>
283
>
// Write to temp resource first
284
>
await this.doWriteFile(tempResource, content, { ...opts, create: true, overwrite: true }, true /* disable write lock */);
285
>
286
>
try {
287
>
288
>
// Rename over existing to ensure atomic replace
289
>
await this.rename(tempResource, resource, { overwrite: true });
290
>
291
>
} catch (error) {
292
293
// Cleanup in case of rename error