From 94052659f6a5a60c630620a48c0abf41264f2c94 Mon Sep 17 00:00:00 2001 From: admin Date: Sun, 26 May 2024 22:33:35 -0400 Subject: [PATCH] Old count_subdirectories and get_subdirectories functions were unusably inefficient when testing on real directories. Updated the functions so that directories are iterated efficiently --- CURRENTLY IN DEBUG BRANCH.txt | 0 CountFolderFiles.py | 20 +++++++++--------- Install_CountFolderFiles.ps1 | 38 +++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 CURRENTLY IN DEBUG BRANCH.txt create mode 100644 Install_CountFolderFiles.ps1 diff --git a/CURRENTLY IN DEBUG BRANCH.txt b/CURRENTLY IN DEBUG BRANCH.txt new file mode 100644 index 0000000..e69de29 diff --git a/CountFolderFiles.py b/CountFolderFiles.py index 11fdb22..24f9678 100644 --- a/CountFolderFiles.py +++ b/CountFolderFiles.py @@ -1,5 +1,6 @@ import os import sys +from pathlib import Path def append_to_folder_name(folder_path, suffix): try: @@ -19,22 +20,20 @@ def append_to_folder_name(folder_path, suffix): def get_subdirectories(folder_path): subdirectories = [] - for root, dirs, files in os.walk(folder_path): - if root.count(os.sep) - folder_path.count(os.sep) < 1: - for dir_name in dirs: - subdirectories.append(os.path.join(root, dir_name)) + for entry in os.scandir(folder_path): + if entry.is_dir(): + subdirectories.append(entry.path) return subdirectories -def count_subdirectories(directory): - subdirectory_count = 0 - for _, dirnames, _ in os.walk(directory): - subdirectory_count += len(dirnames) - return subdirectory_count +def count_subdirectories(path): + return sum(1 for dir in Path(path).iterdir() if dir.is_dir()) def count_folder_files(folder_path): try: # If no subfolders exist, return the number of files in the folder + print("entering count_subdirectories") num_subdirectories = count_subdirectories(folder_path) + print("exiting count_subdirectories") if num_subdirectories == 0: # Count the number of files in the folder @@ -44,12 +43,14 @@ def count_folder_files(folder_path): # If subdirectories do exist, return the number of files in each subdirectory then this directory else: file_count = "" + print("entering get_subdirectories") subdirectories = get_subdirectories(folder_path) for i, directory in enumerate(subdirectories): file_count = file_count + str(sum(1 for entry in os.scandir(directory) if entry.is_file())) #If there's another element, add a space (Keep code this way so that append folder files looks right) if i != len(subdirectories) - 1: file_count = file_count + " " + print(file_count) #Append the number of files in the folder unless if there are none if (sum(1 for entry in os.scandir(folder_path) if entry.is_file()) > 0): file_count = file_count + " " + str(sum(1 for entry in os.scandir(folder_path) if entry.is_file())) @@ -95,6 +96,7 @@ def main(): os.system("pause") for arg in args: directory_name = arg + print("entering count_folder_files") suffix = count_folder_files(directory_name) # If [num] already exists at the end of the string, remove it so we can update it directory_name_cleaned = clean_directory_name(directory_name) diff --git a/Install_CountFolderFiles.ps1 b/Install_CountFolderFiles.ps1 new file mode 100644 index 0000000..8759066 --- /dev/null +++ b/Install_CountFolderFiles.ps1 @@ -0,0 +1,38 @@ +$isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) + +if ($isAdmin) { + pyinstaller --onefile CountFolderFiles.py + cd dist + $directoryPath = "C:\Program Files\Python311\Scripts\" + if (Test-Path $directoryPath -PathType Container) { + + # Add CountFolderFiles.exe to Python Scripts + Copy-Item -Path .\CountFolderFiles.exe -Destination 'C:\Program Files\Python311\Scripts\' -Force + + + + # Get the name of the SendTo folder for the user of the current directory. (can't use %appdata% since we are logged in as admin) + $directoryPath = $PWD.Path + $separator = "\" + $parts = $directoryPath.Split('\') + $extractedString = $parts[0..2] -join $separator + $SendToPath = $extractedString + "\AppData\Roaming\Microsoft\Windows\SendTo\CountFolderFiles.lnk" + + + # Add a shortcut to C:\Program Files\Python311\Scripts\CountFolderFiles.exe in SendTo folder + $SourceExe = "C:\Program Files\Python311\Scripts\CountFolderFiles.exe" + $DestinationPath = $SendToPath + + $WshShell = New-Object -ComObject WScript.Shell + $Shortcut = $WshShell.CreateShortcut($DestinationPath) + $Shortcut.TargetPath = $SourceExe + $Shortcut.Save() + + Read-Host -Prompt "Done, Press enter to exit." + } else { + Read-Host -Prompt "The Python311 directory does not exist. Please install manually (read the powershell commands) or use Python 3.11." + } +} +else { + Read-Host -Prompt "Please run this script as admin." +}