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
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with
16 additions and
6 deletions
-
src/iOS/Avalonia.iOS/Storage/IOSStorageItem.cs
|
|
|
@ -174,25 +174,35 @@ internal sealed class IOSStorageFile : IOSStorageItem, IStorageBookmarkFile |
|
|
|
|
|
|
|
public Task<Stream> OpenReadAsync() |
|
|
|
{ |
|
|
|
return Task.FromResult(CreateStream(FileAccess.Read)); |
|
|
|
return Task.FromResult(CreateStream(FileMode.Open, FileAccess.Read)); |
|
|
|
} |
|
|
|
|
|
|
|
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 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; |
|
|
|
|