Files
mihailkudravcev dc8be1bd1a Fix Windows MAX_PATH failures for percent-encoded wiki filenames.
Cap encoded slug length and use \\?\ long-path writes (0.3.6).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-24 10:55:31 +03:00

54 lines
1.3 KiB
Python

"""Filesystem helpers (Windows MAX_PATH / long paths)."""
from __future__ import annotations
import os
import shutil
from pathlib import Path
def fs_path(path: Path | str) -> Path:
"""
On Windows, prefix with ``\\\\?\\`` so open/mkdir work beyond MAX_PATH (~260).
No-op on other platforms. Idempotent if already prefixed.
"""
p = Path(path)
if os.name != "nt":
return p
s = os.fspath(p)
if s.startswith("\\\\?\\"):
return p
if not p.is_absolute():
p = p.resolve()
s = os.fspath(p)
if s.startswith("\\\\"):
# UNC: \\server\share\... → \\?\UNC\server\share\...
return Path("\\\\?\\UNC\\" + s[2:])
return Path("\\\\?\\" + s)
def ensure_dir(path: Path) -> Path:
p = fs_path(path)
p.mkdir(parents=True, exist_ok=True)
return p
def write_text(path: Path, text: str, *, encoding: str = "utf-8") -> None:
p = fs_path(path)
p.parent.mkdir(parents=True, exist_ok=True)
p.write_text(text, encoding=encoding)
def copy_file(src: Path, dst: Path) -> None:
s = fs_path(src)
d = fs_path(dst)
d.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(s, d)
def remove_file(path: Path) -> None:
p = fs_path(path)
if p.is_file():
p.unlink()