using System; using System.IO; using System.Security; using System.Threading.Tasks; namespace Avalonia.Platform.Storage.FileIO; internal class BclStorageFile : IStorageBookmarkFile { public BclStorageFile(string fileName) { FileInfo = new FileInfo(fileName); } public BclStorageFile(FileInfo fileInfo) { FileInfo = fileInfo ?? throw new ArgumentNullException(nameof(fileInfo)); } public FileInfo FileInfo { get; } public string Name => FileInfo.Name; public virtual bool CanBookmark => true; public Uri Path { get { try { if (FileInfo.Directory is not null) { return StorageProviderHelpers.FilePathToUri(FileInfo.FullName); } } catch (SecurityException) { } return new Uri(FileInfo.Name, UriKind.Relative); } } public Task GetBasicPropertiesAsync() { if (FileInfo.Exists) { return Task.FromResult(new StorageItemProperties( (ulong)FileInfo.Length, FileInfo.CreationTimeUtc, FileInfo.LastAccessTimeUtc)); } return Task.FromResult(new StorageItemProperties()); } public Task GetParentAsync() { if (FileInfo.Directory is { } directory) { return Task.FromResult(new BclStorageFolder(directory)); } return Task.FromResult(null); } public Task OpenReadAsync() { return Task.FromResult(FileInfo.OpenRead()); } public Task OpenWriteAsync() { return Task.FromResult(FileInfo.OpenWrite()); } public virtual Task SaveBookmarkAsync() { return Task.FromResult(FileInfo.FullName); } public Task ReleaseBookmarkAsync() { // No-op return Task.CompletedTask; } protected virtual void Dispose(bool disposing) { } ~BclStorageFile() { Dispose(disposing: false); } public void Dispose() { Dispose(disposing: true); GC.SuppressFinalize(this); } }