2 changed files with 90 additions and 0 deletions
@ -0,0 +1,5 @@ |
|||||
|
<ProjectConfiguration> |
||||
|
<Settings> |
||||
|
<IgnoreThisComponentCompletely>True</IgnoreThisComponentCompletely> |
||||
|
</Settings> |
||||
|
</ProjectConfiguration> |
||||
@ -0,0 +1,85 @@ |
|||||
|
using System; |
||||
|
using System.Collections.ObjectModel; |
||||
|
using System.IO; |
||||
|
using System.Linq; |
||||
|
using System.Reactive.Disposables; |
||||
|
using System.Reactive.Linq; |
||||
|
using Avalonia.Controls.Platform; |
||||
|
using Avalonia.Logging; |
||||
|
|
||||
|
namespace Avalonia.Win32 |
||||
|
{ |
||||
|
internal class WindowsMountedVolumeInfoListener : IDisposable |
||||
|
{ |
||||
|
private readonly CompositeDisposable _disposables; |
||||
|
private bool _beenDisposed = false; |
||||
|
private ObservableCollection<MountedVolumeInfo> mountedDrives; |
||||
|
|
||||
|
public WindowsMountedVolumeInfoListener(ObservableCollection<MountedVolumeInfo> mountedDrives) |
||||
|
{ |
||||
|
this.mountedDrives = mountedDrives; |
||||
|
_disposables = new CompositeDisposable(); |
||||
|
|
||||
|
var pollTimer = Observable.Interval(TimeSpan.FromSeconds(1)) |
||||
|
.Subscribe(Poll); |
||||
|
|
||||
|
_disposables.Add(pollTimer); |
||||
|
|
||||
|
Poll(0); |
||||
|
} |
||||
|
|
||||
|
private void Poll(long _) |
||||
|
{ |
||||
|
var allDrives = DriveInfo.GetDrives(); |
||||
|
|
||||
|
var mountVolInfos = allDrives |
||||
|
.Where(p => |
||||
|
{ |
||||
|
try |
||||
|
{ |
||||
|
var ret = p.IsReady; |
||||
|
return ret; |
||||
|
} |
||||
|
catch (Exception e) |
||||
|
{ |
||||
|
Logger.TryGet(LogEventLevel.Warning, LogArea.Control)?.Log(this, $"Error in Windows drive enumeration: {e.Message}"); |
||||
|
} |
||||
|
return false; |
||||
|
}) |
||||
|
.Select(p => new MountedVolumeInfo() |
||||
|
{ |
||||
|
VolumeLabel = string.IsNullOrEmpty(p.VolumeLabel.Trim()) ? p.RootDirectory.FullName |
||||
|
: $"{p.VolumeLabel} ({p.Name})", |
||||
|
VolumePath = p.RootDirectory.FullName, |
||||
|
VolumeSizeBytes = (ulong)p.TotalSize |
||||
|
}) |
||||
|
.ToArray(); |
||||
|
|
||||
|
if (mountedDrives.SequenceEqual(mountVolInfos)) |
||||
|
return; |
||||
|
else |
||||
|
{ |
||||
|
mountedDrives.Clear(); |
||||
|
|
||||
|
foreach (var i in mountVolInfos) |
||||
|
mountedDrives.Add(i); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
protected virtual void Dispose(bool disposing) |
||||
|
{ |
||||
|
if (!_beenDisposed) |
||||
|
{ |
||||
|
if (disposing) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
_beenDisposed = true; |
||||
|
} |
||||
|
} |
||||
|
public void Dispose() |
||||
|
{ |
||||
|
Dispose(true); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue