duplicati/duplicati · error · FileMissingException

File not found: {remotename}

Error message

File not found: {remotename}

What it means

Thrown by DrimeBackend.GetAsync when FindFileEntryAsync returns null for the requested remotename. Duplicati looks up the file entry (by name, via the file cache populated by listing) before issuing a download-by-hash; if no entry matches, it raises FileMissingException. This is the standard 'file does not exist on the remote backend' signal that Duplicati's core treats as a recoverable/expected condition.

Source

Thrown at Duplicati/Library/Backend/DrimeCloud/DrimeBackend.cs:401

        // Update cache
        cache[result.FileEntry.Name] = new CachedFileEntry(result.FileEntry.Id, result.FileEntry.Hash, result.FileEntry.File_Size);
    }

    /// <inheritdoc/>
    public async Task GetAsync(string remotename, string filename, CancellationToken cancelToken)
    {
        await using var fs = File.Create(filename);
        await GetAsync(remotename, fs, cancelToken).ConfigureAwait(false);
    }

    /// <inheritdoc/>
    public async Task GetAsync(string remotename, Stream stream, CancellationToken cancelToken)
    {
        var client = await GetClientAsync(cancelToken).ConfigureAwait(false);
        var entry = await FindFileEntryAsync(remotename, cancelToken).ConfigureAwait(false);

        if (entry == null)
            throw new FileMissingException($"File not found: {remotename}");

        // Download by hash
        var url = $"file-entries/download/{entry.Hash}";

        var response = await Utility.Utility.WithTimeout(_timeouts.ShortTimeout, cancelToken,
            ct => client.SendAsync(new HttpRequestMessage(HttpMethod.Get, url),
                HttpCompletionOption.ResponseHeadersRead, ct)).ConfigureAwait(false);

        await EnsureSuccessStatusCodeAsync(response).ConfigureAwait(false);

        await using var responseStream = await Utility.Utility.WithTimeout(_timeouts.ShortTimeout, cancelToken, ct =>
            response.Content.ReadAsStreamAsync(ct)).ConfigureAwait(false);

        using var timeoutStream = stream.ObserveWriteTimeout(_timeouts.ReadWriteTimeout);
        await responseStream.CopyToAsync(timeoutStream, cancelToken).ConfigureAwait(false);
    }

    /// <inheritdoc/>

View on GitHub (pinned to 3f348be3e3)

Solutions

  1. If this occurs during a restore, run a backup or 'list' first so the file cache is refreshed and confirm the file is actually expected to exist.
  2. If the file was legitimately deleted remotely, run Duplicati's repair/purge-broken-files to reconcile the local database with the backend.
  3. Ensure only one Duplicati task targets this destination concurrently to avoid cross-deletion.
  4. If the file should exist, verify the target folder path option is correct and the file sits under that path.
Defensive patterns

Strategy: validation

Validate before calling

// Refresh the file cache, then check existence before GetAsync.
var cache = await backend.GetFileCacheAsync(cancelToken); // or list first
if (!cache.ContainsKey(remotename))
    return; // or skip / mark missing

Type guard

static bool FileExists(IReadOnlyDictionary<string, CachedFileEntry> cache, string remotename)
    => cache.TryGetValue(remotename, out var entry) && entry.Id != 0;

Try / catch

try { await backend.GetAsync(remotename, filename, cancelToken); }
catch (FileMissingException) { /* expected: file already purged, reconcile db */ }

Prevention

When it happens

Trigger: Triggered when GetAsync is called for a remotename that has no matching entry in the Drime Cloud folder, i.e. FindFileEntryAsync(remotename) yields null. Common during restore of a file that was deleted, during prune operations on already-removed blocks, or when the local file cache is stale relative to the remote folder.

Common situations: Restoring or deleting a dblock/dlist block that another run already purged; concurrent Duplicati instances pruning the same destination; the file was removed via the Drime Cloud web UI; cache desync after a failed earlier run.

Related errors


AI-assisted analysis of duplicati/duplicati@3f348be3e3 (2026-08-13). Data as JSON: /api/errors/0f7a864a6dd49304. Report an issue: GitHub.