📱 A Windows command-line utility for copying files from phones and other media devices connected as MTP devices.
MediaDeviceCopier/MtpDevice.csTryResilientDownload():
_device.DownloadFile() attemptFileCopyStatus.SkippedBecauseUnsupportedFilteringTests.cs covers regex filtering onlyMoveTests.cs covers move semantics only// Strategy context passed to each attempt
public class DownloadStrategyContext
{
public string SourceFilePath { get; init; }
public string TargetFilePath { get; init; }
public string FileExtension { get; init; }
public IMediaDevice Device { get; init; }
}
// Strategy delegate signature
public delegate bool DownloadStrategy(DownloadStrategyContext context);
_device.DownloadFile() call// Lightweight file classifier for future specialization
public enum FileMediaClass
{
Unknown,
Image, // jpg, png, gif, bmp, etc.
Video, // mp4, mov, avi, etc.
Audio, // wav, mp3, flac, etc.
Metadata, // thm, lrv, etc.
Document // pdf, txt, etc.
}
public static FileMediaClass ClassifyFile(string extension, ulong? size = null)
{
// Simple extension mapping, size heuristics optional
// Enables future per-class strategy customization without hardcoding
}
Each strategy attempt logs:
Example output:
[Standard] Started
[Standard] Failed: COMException 0x80004005 (12ms)
[StreamRetry] Started
[StreamRetry] Success (156ms)
DownloadStrategyContext and DownloadStrategy delegateMtpDeviceTryResilientDownload() to iterate strategy listFileMediaClass enumClassifyFile() with basic extension mappingStrategyTestMock in test project:
SkippedBecauseUnsupportedskipExisting bypasses strategy executionMediaDeviceCopier/MtpDevice.cs
TryResilientDownload() and helper methodsMediaDeviceCopier.Tests.Mocked/StrategyTests.cs
MediaDeviceCopier.Tests.Mocked/StrategyTestMock.cs
README.md
TryResilientDownload() and helpers onlyCopyFile() interface unchangedskipExisting optimization preserved