📱 A Windows command-line utility for copying files from phones and other media devices connected as MTP devices.
MediaDeviceCopier/MtpDevice.cs
TryResilientDownload()
:
_device.DownloadFile()
attemptFileCopyStatus.SkippedBecauseUnsupported
FilteringTests.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
delegateMtpDevice
TryResilientDownload()
to iterate strategy listFileMediaClass
enumClassifyFile()
with basic extension mappingStrategyTestMock
in test project:
SkippedBecauseUnsupported
skipExisting
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