Radarr/Radarr · error · FileNotFoundException

Movie file path does not exist

Error message

Movie file path does not exist

What it means

MovieFileMovingService.TransferFile resolves the source path (movieFile.Path, else movie.Path + RelativePath) and verifies it exists; if missing it throws FileNotFoundException with the resolved path as the fileName.

Source

Thrown at src/NzbDrone.Core/MediaFiles/MovieFileMovingService.cs:112

                _logger.Debug("Attempting to hardlink movie file: {0} to {1}", movieFile.Path, filePath);
                return TransferFile(movieFile, localMovie.Movie, filePath, TransferMode.HardLinkOrCopy, localMovie);
            }

            _logger.Debug("Copying movie file: {0} to {1}", movieFile.Path, filePath);
            return TransferFile(movieFile, localMovie.Movie, filePath, TransferMode.Copy, localMovie);
        }

        private MovieFile TransferFile(MovieFile movieFile, Movie movie, string destinationFilePath, TransferMode mode, LocalMovie localMovie = null)
        {
            Ensure.That(movieFile, () => movieFile).IsNotNull();
            Ensure.That(movie, () => movie).IsNotNull();
            Ensure.That(destinationFilePath, () => destinationFilePath).IsValidPath(PathValidationType.CurrentOs);

            var movieFilePath = movieFile.Path ?? Path.Combine(movie.Path, movieFile.RelativePath);

            if (!_diskProvider.FileExists(movieFilePath))
            {
                throw new FileNotFoundException("Movie file path does not exist", movieFilePath);
            }

            if (movieFilePath == destinationFilePath)
            {
                throw new SameFilenameException("File not moved, source and destination are the same", movieFilePath);
            }

            movieFile.RelativePath = movie.Path.GetRelativePath(destinationFilePath);

            if (localMovie is not null)
            {
                localMovie.FileNameBeforeRename = movieFile.RelativePath;
            }

            if (localMovie is not null && _scriptImportDecider.TryImport(movieFilePath, destinationFilePath, localMovie, movieFile, mode) is var scriptImportDecision && scriptImportDecision != ScriptImportDecision.DeferMove)
            {
                if (scriptImportDecision == ScriptImportDecision.RenameRequested)
                {

View on GitHub (pinned to ca451608dc)

Solutions

  1. Trigger a rescan/refresh of the movie so on-disk state and DB paths agree.
  2. Verify the movie's path and the file's RelativePath are correct in the DB.
  3. Ensure the source share is mounted, then retry the import/move.

Example fix

// before: moving from a stale DB path
_transferService.TransferFile(movieFile, movie, dest, TransferMode.Move);

// after: reconcile existence first
var src = movieFile.Path ?? Path.Combine(movie.Path, movieFile.RelativePath);
if (!_diskProvider.FileExists(src)) { await _movieService.RefreshMovieInfo(movie); return; }
_transferService.TransferFile(movieFile, movie, dest, TransferMode.Move);
Defensive patterns

Strategy: validation

Validate before calling

var src = movieFile.Path ?? Path.Combine(movie.Path, movieFile.RelativePath);
if (!_diskProvider.FileExists(src)) { await RefreshMovie(movie); return; }

Type guard

static bool IsSourcePresent(IDiskProvider d, MovieFile f, Movie m){ var p = f.Path ?? Path.Combine(m.Path, f.RelativePath); return d.FileExists(p); }

Prevention

When it happens

Trigger: TransferFile is invoked when the resolved source movie file does not exist on disk — file already moved/renamed externally, DB out of sync with disk, or a wrong relative path.

Common situations: Files moved or renamed outside Radarr, an interrupted earlier import that left the DB inconsistent, network share reconnecting with a different layout, or a migration that changed paths.

Related errors


AI-assisted analysis of Radarr/Radarr@ca451608dc (2026-08-13). Data as JSON: /api/errors/e876d1ecc9de3549. Report an issue: GitHub.