Old count_subdirectories and get_subdirectories functions were unusably inefficient when testing on real directories. Updated the functions so that directories are iterated efficiently

This commit is contained in:
admin 2024-05-26 22:33:35 -04:00
parent 6ad29c3fed
commit 94052659f6
3 changed files with 49 additions and 9 deletions

View File

View File

@ -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)

View File

@ -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."
}