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
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.
Sorted/documents/
notes.txt
notes (1).txtNOWE
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
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