Browse Source

[iOS] Truncate file in IOSStorageFile.OpenWrite (#20807)

* [iOS] Truncate file in IOSStorageFile.OpenWrite

* Stop accessing scoped resources on exception
pull/20817/head
Julien Lebosquain 3 weeks ago
committed by GitHub
parent
commit
b8457014dd
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 22
      src/iOS/Avalonia.iOS/Storage/IOSStorageItem.cs

22
src/iOS/Avalonia.iOS/Storage/IOSStorageItem.cs

@ -174,25 +174,35 @@ internal sealed class IOSStorageFile : IOSStorageItem, IStorageBookmarkFile
public Task<Stream> OpenReadAsync() public Task<Stream> OpenReadAsync()
{ {
return Task.FromResult(CreateStream(FileAccess.Read)); return Task.FromResult(CreateStream(FileMode.Open, FileAccess.Read));
} }
public Task<Stream> OpenWriteAsync() public Task<Stream> 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 path = document.FileUrl.Path!;
var scopeCreated = SecurityScopedAncestorUrl.StartAccessingSecurityScopedResource(); 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 ? return scopeCreated ?
new SecurityScopedStream(stream, Disposable.Create(() => new SecurityScopedStream(stream, Disposable.Create(() =>
{ {
document.Dispose();
SecurityScopedAncestorUrl.StopAccessingSecurityScopedResource(); SecurityScopedAncestorUrl.StopAccessingSecurityScopedResource();
})) : })) :
stream; stream;

Loading…
Cancel
Save