{"record":{"id":"0fc002c7b6919d4d","repo":"duplicati/duplicati","slug":"filemissing-0fc002","errorCode":"FileMissing","errorMessage":"The requested file does not exist","messagePattern":"The requested file does not exist","errorType":"exception","errorClass":"FileMissingException","httpStatus":null,"severity":"error","filePath":"Duplicati/Library/Backend/Jottacloud/Jottacloud.cs","lineNumber":309,"sourceCode":"        (var client, var _) = await GetClient(cancelToken).ConfigureAwait(false);\n        var doc = new System.Xml.XmlDocument();\n        try\n        {\n            // Send request and load XML response.\n            using var req = await CreateRequest(HttpMethod.Get, remotename, \"\", false, cancelToken).ConfigureAwait(false);\n\n            using var response = await Utility.Utility.WithTimeout(m_timeouts.ListTimeout, cancelToken,\n                    innerCancellationToken =>\n                        client.GetResponseAsync(req, HttpCompletionOption.ResponseHeadersRead, innerCancellationToken))\n                .ConfigureAwait(false);\n\n            await using var rs = await response.Content.ReadAsStreamAsync(cancelToken).ConfigureAwait(false);\n            doc.Load(rs);\n        }\n        catch (HttpRequestException wex)\n        {\n            if (wex.StatusCode == HttpStatusCode.NotFound)\n                throw new FileMissingException(wex);\n            throw;\n        }\n\n        // Handle XML response. Since we in the constructor demand a folder below the mount point we know the root\n        // element must be a \"folder\", else it could also have been a \"mountPoint\" (which has a very similar structure).\n        // We must check for \"deleted\" attribute, because files/folders which has it is deleted (attribute contains the timestamp of deletion)\n        // so we treat them as non-existent here.\n        var xFile = doc.DocumentElement;\n        if (xFile?.Attributes[\"deleted\"] != null)\n            throw new FileMissingException($\"{LC.L(\"The requested file does not exist\")}: {remotename}\");\n\n        return ToFileEntry(xFile);\n    }\n\n    /// <inheritdoc/>\n    public async Task PutAsync(string remotename, string filename, CancellationToken cancelToken)\n    {\n        await using var fs = File.OpenRead(filename);","sourceCodeStart":291,"sourceCodeEnd":327,"githubUrl":"https://github.com/duplicati/duplicati/blob/3f348be3e33f5d72d414e3ad55839c2ba34dda67/Duplicati/Library/Backend/Jottacloud/Jottacloud.cs#L291-L327","documentation":"Thrown inside the private Info() method when the JFS GET for a single file returns HTTP 404 NotFound. Info() is called by ParallelGetAsync to learn the file size before chunking, so this surfaces during parallel downloads.","triggerScenarios":"Requesting Info (via GetAsync with m_threads > 1) for a remotename that does not exist on the server, or that was deleted between the list call and the get call.","commonSituations":"A backup block file was already deleted by a concurrent purge; the remote name is misspelled; another client removed the file; an interrupted prior run left the remote state inconsistent.","solutions":["Verify the file appears in ListAsync output before downloading.","If a concurrent operation deletes files, serialize or re-list before each get.","Treat as transient and retry once the expected file is present."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// Confirm the file is listed before parallel download\nvar exists = false;\nawait foreach (var e in backend.ListAsync(token))\n    if (e.Name == remotename) { exists = true; break; }\nif (!exists) throw new FileNotFoundException(remotename);","typeGuard":null,"tryCatchPattern":"try { await backend.GetAsync(remotename, dest, token); }\ncatch (FileMissingException ex) { logger.LogWarning(\"File gone: {Message}\", ex.Message); /* skip or re-list */ }","preventionTips":["Re-list before downloading if a concurrent purge may remove block files.","Serialize delete and get operations on the same backend to avoid races.","Validate remote names against the latest list before issuing parallel gets."],"tags":["network","jottacloud","file-missing","http-404"],"backgroundTag":null,"analyzedSha":"3f348be3e33f5d72d414e3ad55839c2ba34dda67","analyzedAt":"2026-08-13T16:48:27.008Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}