Flow-Launcher/Flow.Launcher · error · FileNotFoundException
Plugin {newPlugin.ID} zip file not found at {filePath}
Error message
Plugin {newPlugin.ID} zip file not found at {filePath} What it means
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.
Source
Thrown at Flow.Launcher.Core/Plugin/PluginInstaller.cs:74
{
await DownloadFileAsync(
$"{Localize.DownloadingPlugin()} {newPlugin.Name}",
newPlugin.UrlDownload, filePath, cts);
}
else
{
filePath = newPlugin.LocalInstallPath;
}
// check if user cancelled download before installing plugin
if (cts.IsCancellationRequested)
{
return;
}
if (!File.Exists(filePath))
{
throw new FileNotFoundException($"Plugin {newPlugin.ID} zip file not found at {filePath}", filePath);
}
if (!PublicApi.Instance.InstallPlugin(newPlugin, filePath))
{
return;
}
if (!newPlugin.IsFromLocalInstallPath)
{
File.Delete(filePath);
}
}
catch (Exception e)
{
PublicApi.Instance.LogException(ClassName, "Failed to install plugin", e);
PublicApi.Instance.ShowMsgError(Localize.ErrorInstallingPlugin());
return; // do not restart on failure
}View on GitHub (pinned to 7fc63b07bb)
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.
Example fix
// before
filePath = newPlugin.LocalInstallPath;
// ... later
if (!File.Exists(filePath)) throw new FileNotFoundException(...);
// after — validate local path up front with a clear message
if (newPlugin.IsFromLocalInstallPath && !File.Exists(newPlugin.LocalInstallPath))
{
PublicApi.Instance.ShowMsgError(Localize.LocalInstallPathMissing(newPlugin.LocalInstallPath));
return;
} Defensive patterns
Strategy: validation
Validate before calling
if (newPlugin.IsFromLocalInstallPath && !File.Exists(newPlugin.LocalInstallPath))
{
PublicApi.Instance.ShowMsgError($"Local install zip not found: {newPlugin.LocalInstallPath}");
return;
}
// after download, confirm size > 0
if (File.Exists(filePath) && new FileInfo(filePath).Length == 0)
return; Type guard
null
Try / catch
try { await InstallPluginAsync(newPlugin); }
catch (FileNotFoundException ex) when (ex.FileName == newPlugin.ID + " zip")
{ PublicApi.Instance.ShowMsgError($"Plugin zip missing: {ex.FileName}"); } Prevention
- 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.
When it happens
Trigger: 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%.
Common situations: 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.
Related errors
- The zip file does not contain a plugin.json file.
- Theme path can't be found <{path}>
- Error code <{response.StatusCode}> returned from <{url}>
- Invalid file path
- Failed to parse folder path
AI-assisted analysis of Flow-Launcher/Flow.Launcher@7fc63b07bb (2026-08-13).
Data as JSON: /api/errors/fc7be38453df304e.
Report an issue: GitHub.