duplicati/duplicati · warning · FileMissingException

File not found: {remotename}

Error message

File not found: {remotename}

What it means

Thrown in Filejump.GetAsync when FindFileEntryIdAsync(remotename) returns null. It is a FileMissingException, which Duplicati maps to a recoverable 'file not present' state rather than a hard fault. The lookup happens after GetClient succeeds and before any download bytes flow.

Source

Thrown at Duplicati/Library/Backend/Filejump/Filejump.cs:293

            cache[result.FileEntry.Name] = new(result.FileEntry.Id, result.FileEntry.Url);
        }

        ///<inheritdoc/>
        public async Task GetAsync(string remotename, string filename, CancellationToken token)
        {
            using var fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
            await GetAsync(remotename, fs, token);
        }

        ///<inheritdoc/>
        public async Task GetAsync(string remotename, Stream stream, CancellationToken token)
        {
            var client = await GetClient(token);

            var entry = await FindFileEntryIdAsync(remotename, token);
            if (entry == null)
                throw new FileMissingException($"File not found: {remotename}");

            var url = entry.Url;
            if (!url.StartsWith("/") && !url.StartsWith("http", StringComparison.OrdinalIgnoreCase))
                url = "/" + url;

            var response = await Utility.Utility.WithTimeout(m_timeoutOptions.ShortTimeout, token,
                ct => client.SendAsync(new HttpRequestMessage(HttpMethod.Get, url), HttpCompletionOption.ResponseHeadersRead, ct));
            response.EnsureSuccessStatusCode();
            using var timeoutStream = stream.ObserveWriteTimeout(m_timeoutOptions.ReadWriteTimeout);
            await response.Content.CopyToAsync(timeoutStream, token);
        }

        /// <summary>
        /// Parses the date time from the string returned by the API (ISO-8601 format).
        /// </summary>
        /// <param name="timestamp">The timestamp to parse</param>
        /// <returns>>The parsed date time</returns>
        private static DateTime ParseDateTime(string timestamp)

View on GitHub (pinned to 3f348be3e3)

Solutions

  1. List the remote folder to confirm whether the file exists and under what exact name/case.
  2. If the file was legitimately removed, let Duplicati's missing-file handling proceed (it re-uploads on the next backup run).
  3. Check for case mismatch between the local dbblock name and the remote entry; normalize naming if needed.
  4. If the file should exist, re-run the backup upload step to recreate it.
Defensive patterns

Strategy: try-catch

Try / catch

try { await backend.GetAsync(remotename, dest, token); }
catch (FileMissingException) { /* Duplicati recovers: re-upload on next run; optionally log */ }

Prevention

When it happens

Trigger: A GET is requested for a remotename that is not present in the Filejump folder (neither in the cache table nor found by a fresh listing). The cache lookup and the on-server search both came back empty.

Common situations: The file was already deleted (e.g. a retention purge removed it). The remotename case or path does not match exactly (Filejump is case-sensitive). A previous upload failed silently so the file was never actually stored. Another tool/session deleted the file between list and get.

Related errors


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