|
|
@ -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; |
|
|
|