From a6a5b28631c2835336e1ece3f6a4b86d7d8f2fd5 Mon Sep 17 00:00:00 2001 From: SRHTNIN Date: Fri, 9 Oct 2026 14:00:38 +0200 Subject: [PATCH] 7.5: Windows support --- GlobalConf.toml | 2 +- InputDirConf.toml | 2 +- OutputDirConf.toml | 2 +- README.md | 8 ++++---- SaraSortd.py | 19 ++++++++++++------- __pycache__/SaraSortd.cpython-314.pyc | Bin 0 -> 34800 bytes 6 files changed, 19 insertions(+), 14 deletions(-) create mode 100644 __pycache__/SaraSortd.cpython-314.pyc diff --git a/GlobalConf.toml b/GlobalConf.toml index 0646441..925d069 100644 --- a/GlobalConf.toml +++ b/GlobalConf.toml @@ -1,5 +1,5 @@ Title = "SaraSortd Config" -Version = "7.4" +Version = "7.5" SafeMode = 1 SilentMode = 0 SortTimer = 1 diff --git a/InputDirConf.toml b/InputDirConf.toml index f29347e..6652ba0 100644 --- a/InputDirConf.toml +++ b/InputDirConf.toml @@ -1,5 +1,5 @@ Title = "Unset" -Version = "7.4" +Version = "7.5" ParentDir = "Unset" SortDirs = 0 diff --git a/OutputDirConf.toml b/OutputDirConf.toml index a32d84a..9c1692a 100644 --- a/OutputDirConf.toml +++ b/OutputDirConf.toml @@ -1,5 +1,5 @@ Title = "Unset" -Version = "7.4" +Version = "7.5" LastFile = "Unset" ParentDir = "Unset" ValidInputDirs = ["*"] diff --git a/README.md b/README.md index 6856564..758253b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ SaraSortd: a file and directory sorting daemon built with python. -(Version = "7.4") +(Version = "7.5") It's made by Sarah, hence the name. :3 @@ -58,7 +58,7 @@ Here's a step-by-step tutorial (in case you don't want to watch the video). ``` Title = "SaraSortd Config" # NOTE: Do not change the title. This is so that the program knows which config file is which. -Version = "7.4" # Just the version number for the config file. +Version = "7.5" # Just the version number for the config file. SafeMode = 1 # If SaraSortd should stop if an error with the config appears. 1 is stop, 0 is continue. @@ -170,7 +170,7 @@ The output directory config references the SaraSortd config (GlobalConf.toml). T ``` Title = "Unset" # NOTE: Do not change the title. This is so that the program knows which config file is which. -Version = "7.4" # The version number of the config. +Version = "7.5" # The version number of the config. LastFile = "Unset" # The last file that was sorted to this directory. It gets automatically updated whenever a file gets sorted to this directory. @@ -226,7 +226,7 @@ Overwrite = 1 # Whether this specific file type can be overwritten by others of ``` Title = "Unset" # NOTE: Do not change the title. This is so that the program knows which config file is which. -Version = "7.4" +Version = "7.5" ParentDir = "Unset" # The name of this directory. It gets automatically updated when this config gets copied to an output directory. diff --git a/SaraSortd.py b/SaraSortd.py index 9a77abe..81a1429 100644 --- a/SaraSortd.py +++ b/SaraSortd.py @@ -6,7 +6,7 @@ import shutil import time import toml -# Version = "7.4" +# Version = "7.5" ConfPath = "./GlobalConf.toml" @@ -235,16 +235,21 @@ def ConfFolder(PathText): return os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(ConfPath)), PathText)) +def Slashes(Path): + # Windows paths use "\\" (and configs may mix both); compare and name them with "/" only. + return Path.replace("\\", "/") + + def FlatName(Path): # A directory's name for files kept outside it: its path below RootDir (or its whole path), "/" turned into "_". - # E.G: "%RootDir%/Pictures/Cats" becomes "Pictures_Cats". - Root = ParsePath(ConfDirs.get("RootDir", "")).rstrip("/") - Path = Path.rstrip("/") + # E.G: "%RootDir%/Pictures/Cats" becomes "Pictures_Cats". On Windows a drive's ":" is dropped (not allowed in names). + Root = Slashes(ParsePath(ConfDirs.get("RootDir", ""))).rstrip("/") + Path = Slashes(Path).rstrip("/") if Root and Path.startswith(Root + "/"): Relative = Path[len(Root) + 1:] else: Relative = Path.strip("/") or os.path.basename(Path) - return Relative.replace("/", "_") + return Relative.replace(":", "").replace("/", "_") def CentralConf(Path, Kind): @@ -252,7 +257,7 @@ def CentralConf(Path, Kind): # [DirConfs] names a file per directory ("dir" = "file", or "dir" = { In = "file", Out = "file" }), # and DirConfDir holds the configs of every directory [DirConfs] doesn't name. None means inside the directory. for Key, Value in (Conf.get("DirConfs") or {}).items(): - if ParsePath(Key).rstrip("/") == Path.rstrip("/"): + if Slashes(ParsePath(Key)).rstrip("/") == Slashes(Path).rstrip("/"): if isinstance(Value, dict): Value = Value.get(Kind) if Value: @@ -301,7 +306,7 @@ def Clone(Source, Destination, NewName, Delete = False): with open(FileHistoryPath, "w", encoding = "utf-8") as HistoryFile: toml.dump(HistoryFileData, HistoryFile) - os.rename(Source, os.path.join(Destination, NewName)) + os.replace(Source, os.path.join(Destination, NewName)) # overwrites on Windows too, like rename on Linux return Dir(Destination, Output = False, CopyConf = False) diff --git a/__pycache__/SaraSortd.cpython-314.pyc b/__pycache__/SaraSortd.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4cc8b9bd818d26aea8403d52b6c14d16b2375fd0 GIT binary patch literal 34800 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 I4H>Eb7jjO9Q~&?~ literal 0 HcmV?d00001