Rozdział 23 · Część IV · Wdrażamy SafeSort

Co zrobić, jeśli nazwisko jest już zajęte

Ani na dysku, ani w ramach jednego planu dwa pliki nigdy nie otrzymają tej samej nazwy docelowej.

SafeSort · Część 4 z 6Wdrożenie
GitHubIssue #6 · Project SafeSort Pierwsze wydanie
Handle destination name collisions
Area: SafetyPriority: Medium
git switch -c feat/plan-and-collisions

Dwa pliki o tej samej nazwie mogą trafić do tej samej kategorii — na przykład dwa różne notes.txt z różnych podkatalogów katalogu źródłowego. Gdyby SafeSort po prostu przesunął plik na istniejący, drugi plik zniknąłby bezgłośnie — Katalog docelowy miałby tę samą nazwę notes.txt, ale z zawartością tylko jednego z dwóch plików, bez żadnego ostrzeżenia o tym.

~/safesort $ safesort apply ~/Downloads
Applied 1 moves.
Sorted/documents/
notes.txt
notes (1).txtNOWE
Plik, który już był w Sorted/documents/, pozostał nietknięty; nowemu nadano wolne imię.

SafeSort nigdy nie rozwiązuje konfliktu nazewnictwa przez nadpisanie: zamiast tego znajduje wolne miejsce nazwa według jasnego schematu.

src/safesort/planner.py
def _resolve_collision(candidate: Path, reserved: set[Path]) -> Path:
    if candidate not in reserved and not candidate.exists():
        return candidate

    stem, suffix, parent = candidate.stem, candidate.suffix, candidate.parent
    counter = 1
    while True:
        alternative = parent / f"{stem} ({counter}){suffix}"
        if alternative not in reserved and not alternative.exists():
            return alternative
        counter += 1
Przykład
otchet.pdf уже существует в Sorted/documents/
→ следующий otchet.pdf получит имя otchet (1).pdf
→ если и оно занято — otchet (2).pdf, и так далее
reserved — konflikty w obrębie jednego planu, nie tylko na dysku
Checki not candidate.exists() na tyle, by kolidować z już istniejącym plikiem na dysku — ale nie kiedy dwa pliki z tego samego planu ubiegają się o tę samą nazwę w tym samym czasie, dopóki żaden z nich nie został jeszcze przeniesiony. Wiele reserved pamięta imiona już użyte w tym planie, więc drugi plik zostanie przyjęty otchet (1).pdf, nawet jeśli nie ma otchet.pdf.
Praktyka: bezpieczna nazwa przy konflikcie
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →
Punkt kontrolny · Issue #6
git commit -m "feat: add safe organization plan with collision handling"
Ta sama gałąź i ten sam Pull Request #17, który zamykał Issue #3 na stronach 23-11. Planowanie i obsługa konfliktów nazw było jednym, ściśle powiązanym zadaniem w terminologii kodu, ale pozostają to dwie różne Issues i dwie różne lekcje.
Status prawdziwego Project: Done