SubtitleEdit/subtitleedit · error · FileNotFoundException

Subtitle file not found

Error message

Subtitle file not found: {filePath}

What it means

Thrown by LoadSubtitleWithFormat when the subtitle file does not exist on disk (File.Exists returns false). This is the standard FileNotFoundException — the path is unresolvable, the file was deleted, or the path is wrong. The file path is embedded in the message for diagnostics.

Solutions

  1. Verify the path with File.Exists before calling LoadSubtitleWithFormat, and surface a clean error.
  2. If the path is relative, resolve it against the intended base directory with Path.GetFullPath before the call.
  3. Check for typos, trailing spaces, or shell-quoting issues in the argument.

Example fix

// before
var (sub, fmt) = LibSEIntegration.LoadSubtitleWithFormat(path);

// after
if (!File.Exists(path))
    throw new FileNotFoundException($"Input subtitle not found: {path}");
var (sub, fmt) = LibSEIntegration.LoadSubtitleWithFormat(path);
Defensive patterns

Strategy: validation

Validate before calling

if (!File.Exists(filePath))
    throw new FileNotFoundException($"Subtitle file not found: {filePath}", filePath);
var (sub, fmt) = LibSEIntegration.LoadSubtitleWithFormat(filePath);

Type guard

static bool IsSubtitleFileReadable(string path) => File.Exists(path);

Try / catch

try { var (sub, fmt) = LibSEIntegration.LoadSubtitleWithFormat(path); }
catch (FileNotFoundException ex) when (ex.Message.Contains("Subtitle file not found"))
{ /* report missing input file to user, check path/spelling */ }

Prevention

When it happens

Trigger: Calling LoadSubtitleWithFormat(filePath, ...) where filePath points to a non-existent file. Common in CLI invocations with a typo'd path, a relative path resolved from the wrong working directory, or a file that was moved/deleted between validation and load.

Common situations: Typo in the CLI input path; relative path resolved against an unexpected CWD (especially in scripts or batch jobs); file on a network mount that dropped; race between file creation and this call.

Related errors


AI-assisted analysis of SubtitleEdit/subtitleedit@17a9f07487 (2026-08-13). Data as JSON: /api/errors/3ef7aa53347da32f. Report an issue: GitHub.

Appendix: source

Thrown at src/seconv/Core/LibSEIntegration.cs:65

        return entries;
    }

    public sealed record FormatEntry(SubtitleFormat Format, string Kind);

    /// <summary>
    /// Loads a subtitle file using LibSE. When <paramref name="encodingName"/> is null/blank,
    /// the encoding is auto-detected from the file's content. When
    /// <paramref name="fallbackEncodingName"/> is supplied (and <paramref name="encodingName"/>
    /// is not), the fallback replaces the ANSI codepage heuristic: a BOM still wins, valid
    /// UTF-8 still wins, but anything else uses the fallback rather than DetectAnsiEncoding.
    /// Also returns the detected source format so the save side can apply
    /// <c>RemoveNativeFormatting</c> if the target is different.
    /// </summary>
    public static (Subtitle Subtitle, SubtitleFormat Format) LoadSubtitleWithFormat(string filePath, string? encodingName = null, string? fallbackEncodingName = null, List<string>? warnings = null)
    {
        if (!File.Exists(filePath))
        {
            throw new FileNotFoundException($"Subtitle file not found: {filePath}");
        }

        var subtitle = new Subtitle();
        Encoding encoding;
        if (!string.IsNullOrWhiteSpace(encodingName))
        {
            encoding = GetEncoding(encodingName);
        }
        else if (!string.IsNullOrWhiteSpace(fallbackEncodingName))
        {
            encoding = DetectEncodingWithFallback(filePath, fallbackEncodingName);
        }
        else
        {
            encoding = LanguageAutoDetect.GetEncodingFromFile(filePath);
        }

        var lines = new List<string>(File.ReadAllLines(filePath, encoding));

View on GitHub (pinned to 17a9f07487)