{"record":{"id":"fc7be38453df304e","repo":"Flow-Launcher/Flow.Launcher","slug":"plugin-newplugin-id-zip-file-not-found-at-filep","errorCode":null,"errorMessage":"Plugin {newPlugin.ID} zip file not found at {filePath}","messagePattern":"Plugin (.+?) zip file not found at (.+?)","errorType":"exception","errorClass":"FileNotFoundException","httpStatus":null,"severity":"error","filePath":"Flow.Launcher.Core/Plugin/PluginInstaller.cs","lineNumber":74,"sourceCode":"            {\n                await DownloadFileAsync(\n                    $\"{Localize.DownloadingPlugin()} {newPlugin.Name}\",\n                    newPlugin.UrlDownload, filePath, cts);\n            }\n            else\n            {\n                filePath = newPlugin.LocalInstallPath;\n            }\n\n            // check if user cancelled download before installing plugin\n            if (cts.IsCancellationRequested)\n            {\n                return;\n            }\n\n            if (!File.Exists(filePath))\n            {\n                throw new FileNotFoundException($\"Plugin {newPlugin.ID} zip file not found at {filePath}\", filePath);\n            }\n\n            if (!PublicApi.Instance.InstallPlugin(newPlugin, filePath))\n            {\n                return;\n            }\n\n            if (!newPlugin.IsFromLocalInstallPath)\n            {\n                File.Delete(filePath);\n            }\n        }\n        catch (Exception e)\n        {\n            PublicApi.Instance.LogException(ClassName, \"Failed to install plugin\", e);\n            PublicApi.Instance.ShowMsgError(Localize.ErrorInstallingPlugin());\n            return; // do not restart on failure\n        }","sourceCodeStart":56,"sourceCodeEnd":92,"githubUrl":"https://github.com/Flow-Launcher/Flow.Launcher/blob/7fc63b07bbaa10a0f0b2601487913fcba9ed24b0/Flow.Launcher.Core/Plugin/PluginInstaller.cs#L56-L92","documentation":"Thrown as FileNotFoundException with the plugin ID and resolved file path when, after the download step (or when IsFromLocalInstallPath is true), the expected zip file does not exist on disk at filePath. The catch at line 87 logs 'Failed to install plugin', shows an error message, and returns without restarting.","triggerScenarios":"Download step completed without throwing but the file at the temp path is absent (antivirus quarantine, temp cleanup, disk full and the partial file removed); IsFromLocalInstallPath is true but LocalInstallPath points to a file the user moved/deleted; the download URL returned 200 but wrote zero bytes and the file was never created; a third-party cleaner wiped %TEMP%.","commonSituations":"Aggressive antivirus/security software quarantining downloaded .zip plugin files; user-supplied local install path that no longer exists; system temp directory cleaned mid-download; insufficient disk space causing the download to fail silently before the file handle flushed.","solutions":["Re-attempt the install (re-download) — the file may have been transiently removed by AV or temp cleanup.","If installing from a local path, confirm the .zip still exists at LocalInstallPath before invoking install.","Check antivirus quarantine/history for the plugin zip and add an exclusion for the Flow Launcher temp directory.","Verify free disk space on the drive holding %TEMP%.","Inspect the download URL in the plugin manifest — a server returning an empty 200 still won't produce a file."],"exampleFix":"// before\nfilePath = newPlugin.LocalInstallPath;\n// ... later\nif (!File.Exists(filePath)) throw new FileNotFoundException(...);\n\n// after — validate local path up front with a clear message\nif (newPlugin.IsFromLocalInstallPath && !File.Exists(newPlugin.LocalInstallPath))\n{\n    PublicApi.Instance.ShowMsgError(Localize.LocalInstallPathMissing(newPlugin.LocalInstallPath));\n    return;\n}","handlingStrategy":"validation","validationCode":"if (newPlugin.IsFromLocalInstallPath && !File.Exists(newPlugin.LocalInstallPath))\n{\n    PublicApi.Instance.ShowMsgError($\"Local install zip not found: {newPlugin.LocalInstallPath}\");\n    return;\n}\n// after download, confirm size > 0\nif (File.Exists(filePath) && new FileInfo(filePath).Length == 0)\n    return;","typeGuard":"null","tryCatchPattern":"try { await InstallPluginAsync(newPlugin); }\ncatch (FileNotFoundException ex) when (ex.FileName == newPlugin.ID + \" zip\")\n{ PublicApi.Instance.ShowMsgError($\"Plugin zip missing: {ex.FileName}\"); }","preventionTips":["Validate LocalInstallPath exists before triggering install.","Add an antivirus exclusion for the Flow Launcher temp directory.","Confirm disk space on the %TEMP% drive before downloading.","Re-download from the manifest URL if the temp file is absent."],"tags":["plugin-install","file-not-found","download","filesystem"],"backgroundTag":null,"analyzedSha":"7fc63b07bbaa10a0f0b2601487913fcba9ed24b0","analyzedAt":"2026-08-13T14:54:20.914Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}