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

  1. Re-attempt the install (re-download) — the file may have been transiently removed by AV or temp cleanup.
  2. If installing from a local path, confirm the .zip still exists at LocalInstallPath before invoking install.
  3. Check antivirus quarantine/history for the plugin zip and add an exclusion for the Flow Launcher temp directory.
  4. Verify free disk space on the drive holding %TEMP%.
  5. 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

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


AI-assisted analysis of Flow-Launcher/Flow.Launcher@7fc63b07bb (2026-08-13). Data as JSON: /api/errors/fc7be38453df304e. Report an issue: GitHub.