From b8457014dd1dd1ffdf3736b07ddb8562aebe3864 Mon Sep 17 00:00:00 2001 From: Julien Lebosquain Date: Thu, 5 Mar 2026 10:15:55 +0000 Subject: [PATCH] [iOS] Truncate file in IOSStorageFile.OpenWrite (#20807) * [iOS] Truncate file in IOSStorageFile.OpenWrite * Stop accessing scoped resources on exception --- .../Avalonia.iOS/Storage/IOSStorageItem.cs | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/iOS/Avalonia.iOS/Storage/IOSStorageItem.cs b/src/iOS/Avalonia.iOS/Storage/IOSStorageItem.cs index 069b1e8d49..663b1fdd20 100644 --- a/src/iOS/Avalonia.iOS/Storage/IOSStorageItem.cs +++ b/src/iOS/Avalonia.iOS/Storage/IOSStorageItem.cs @@ -174,25 +174,35 @@ internal sealed class IOSStorageFile : IOSStorageItem, IStorageBookmarkFile public Task OpenReadAsync() { - return Task.FromResult(CreateStream(FileAccess.Read)); + return Task.FromResult(CreateStream(FileMode.Open, FileAccess.Read)); } public Task OpenWriteAsync() { - return Task.FromResult(CreateStream(FileAccess.Write)); + return Task.FromResult(CreateStream(FileMode.Create, FileAccess.Write)); } - private Stream CreateStream(FileAccess fileAccess) + private Stream CreateStream(FileMode fileMode, FileAccess fileAccess) { - var document = new UIDocument(Url); + using var document = new UIDocument(Url); var path = document.FileUrl.Path!; var scopeCreated = SecurityScopedAncestorUrl.StartAccessingSecurityScopedResource(); - var stream = File.Open(path, FileMode.Open, fileAccess); + + FileStream stream; + try + { + stream = new FileStream(path, fileMode, fileAccess); + } + catch + { + if (scopeCreated) + SecurityScopedAncestorUrl.StopAccessingSecurityScopedResource(); + throw; + } return scopeCreated ? new SecurityScopedStream(stream, Disposable.Create(() => { - document.Dispose(); SecurityScopedAncestorUrl.StopAccessingSecurityScopedResource(); })) : stream;