QWKSync.NET is a small, dependency-free .NET library that safely and predictably moves QWK and REP files between a local application and a remote endpoint. It operates strictly at the transport and orchestration level and does not parse, validate, or interpret packet contents.
QWKSync.NET:
It does not understand what those files mean. All packet semantics belong to your application.
QWKSync.NET is not:
If a feature requires knowing what is inside a packet, it does not belong in QWKSync.NET.
The narrow scope is intentional and provides value. By focusing only on file transport and orchestration, QWKSync.NET remains:
QWKSync.NET ships with exactly one built-in transport:
All network protocols (HTTP, FTP, SFTP, etc.) are provided as external extension assemblies.
Create a profile with the appropriate TransportId:
QwkSyncProfile profile = new QwkSyncProfile
{
Endpoint = new Uri("https://example.com/api"),
TransportId = "http"
};
You must ensure the transport extension assembly is referenced in your project and that the transport factory is registered.
Yes. See Creating Transport Extensions for detailed instructions.
No. QWKSync.NET does not define any HTTP wire protocol. If you need HTTP transport functionality, you must implement a transport extension that defines and implements your chosen protocol contract.
QWKSync.NET defaults are intentionally conservative:
Any deviation from these defaults must be explicitly configured.
Configure TransferPolicy with MaxRetries:
TransferPolicy policy = new TransferPolicy
{
MaxRetries = 3
};
QwkSyncPlan plan = new QwkSyncPlan
{
LocalInboxDirectory = "/path/to/inbox",
LocalOutboxDirectory = "/path/to/outbox",
Transfer = policy
};
Configure TransferPolicy with Timeout:
TransferPolicy policy = new TransferPolicy
{
Timeout = TimeSpan.FromMinutes(5)
};
The timeout applies per individual transfer operation (each list, download, upload, move, or delete call).
Configure PacketDiscovery:
PacketDiscovery discovery = new PacketDiscovery
{
QwkSearchPattern = "*.qwk",
RepSearchPattern = "*.rep",
PickStrategy = PacketPickStrategy.Newest,
RemoteInboxPath = "inbox",
RemoteOutboxPath = "outbox"
};
QwkSyncPlan plan = new QwkSyncPlan
{
LocalInboxDirectory = "/path/to/inbox",
LocalOutboxDirectory = "/path/to/outbox",
Discovery = discovery
};
QWKSync.NET makes no assumptions about packet counts or relationships. A sync session may:
There is no assumed pairing between QWK and REP files.
No. QWKSync.NET treats .qwk and .rep files as opaque binary files. It does not validate, parse, or interpret packet semantics. Validation and parsing belong in your application code or a separate QWK parsing library, such as QWK.NET.
Packets are ordered deterministically using the PickStrategy specified in PacketDiscovery. The default strategy is PacketPickStrategy.Newest.
QWKSync.NET returns a QwkSyncResult with:
Outcome indicating success, partial success, or failureIssues list describing what happenedIndividual transfer failures are captured as issues. The operation continues to attempt remaining transfers unless cancelled.
QWKSync.NET may throw:
QwkSyncConcurrencyException — when attempting concurrent syncs on the same local directoriesOperationCanceledException — when cancellation is requestedCheck the Outcome and Issues properties of QwkSyncResult:
QwkSyncResult result = await client.SyncAsync(profile, plan, cancellationToken);
if (result.Outcome == QwkSyncOutcome.PartialSuccess)
{
foreach (QwkSyncIssue issue in result.Issues)
{
Console.WriteLine($"Issue: {issue.Description}");
}
}
QWKSync.NET enforces a single-flight guarantee: only one sync can operate on the same local inbox directory, local outbox directory, or profile scope at a time. Attempting concurrent syncs will throw QwkSyncConcurrencyException.
Pass a CancellationToken to SyncAsync and cancel the token source:
using CancellationTokenSource cts = new CancellationTokenSource();
// Later, to cancel:
cts.Cancel();
await client.SyncAsync(profile, plan, cts.Token);
Cancellation interrupts I/O promptly and triggers cleanup of temporary files.
QWKSync.NET has zero third-party dependencies. It relies only on the .NET Base Class Library (BCL).
Yes, QWKSync.NET is MIT licensed.
Please report bugs through the repository’s issue tracker.