summaryrefslogtreecommitdiff
path: root/file_ops.py
diff options
context:
space:
mode:
authorOwl <isaclien9752@gmail.com>2025-08-21 20:07:13 -0400
committerOwl <isaclien9752@gmail.com>2025-08-21 20:07:13 -0400
commitef4d0e08b2d312bcf3034aa3ae48436f5d8b56a5 (patch)
tree88c06847d16e29acdd743066b0781fc17ebde3eb /file_ops.py
parent5fb5906f45a20652b8cbadc5657df9ca506f11db (diff)
downloadblenxy-ef4d0e08b2d312bcf3034aa3ae48436f5d8b56a5.tar.gz
blenxy-ef4d0e08b2d312bcf3034aa3ae48436f5d8b56a5.zip
all the stuff
Diffstat (limited to 'file_ops.py')
-rw-r--r--file_ops.py239
1 files changed, 239 insertions, 0 deletions
diff --git a/file_ops.py b/file_ops.py
new file mode 100644
index 0000000..b9b3f6f
--- /dev/null
+++ b/file_ops.py
@@ -0,0 +1,239 @@
+# my functions for file creation/deletion operations
+# also for file path string stuff
+import os, shutil
+
+# function to format a path string correctly:
+# - no duplicate slashes
+# - no backward slashes
+# - nothing ends with a slash
+def get_path_str(path):
+
+ # check params
+ if (type(path) != str):
+ return ""
+
+ # else work on the string
+ rtn_str = ""
+ while (path != ""):
+ if (path[0] in "/\\"):
+ rtn_str += '/'
+ while (len(path) > 0 and path[0] in "/\\"):
+ path = path[1:]
+ if (len(path) > 0):
+ rtn_str += path[0]
+ path = path[1:]
+
+ # check if there is an ending slash
+ if (rtn_str[-1] == '/'):
+ rtn_str = rtn_str[:-1]
+
+ # done!
+ return rtn_str
+
+# function to check if a file/folder path exists or not
+def f_exists(path):
+ path = get_path_str(path)
+ return os.path.exists(path)
+
+# function to check if a file path actually points to a file
+def is_file(path):
+ path = get_path_str(path)
+ return os.path.isfile(path)
+
+# function to check if a folder path actually points to a folder
+def is_folder(path):
+ path = get_path_str(path)
+ return os.path.isdir(path)
+
+# function to get the file name portion of a file path
+def get_file_name(path):
+
+ # check params
+ if (type(path) != str):
+ return None
+ path = get_path_str(path)
+
+ # get the full path of the file/folder
+ if (f_exists(path)):
+ path = os.path.abspath(path)
+
+ # start reading path string
+ string = ""
+ for i in range(len(path) - 1, -1, -1):
+ if (path[i] == '/'):
+ for j in range(i + 1, len(path)):
+ string += path[j]
+ break
+
+ # done!
+ return string
+
+# function to get the base path of a file or folder
+def get_base_path(path, is_file):
+
+ # check params
+ if ((type(path) != str) or (type(is_file) != bool)):
+ return None
+ path = get_path_str(path)
+
+ # get the full path of the file/folder
+ if (f_exists(path)):
+ path = get_path_str(os.path.abspath(path))
+
+ # work on path
+ if (is_file):
+ while (path != ""):
+ if (path[-1] == '/'):
+ path = path[:-1]
+ break
+ path = path[:-1]
+ return path
+
+# function to get the base path of a file or folder
+def get_base_folder_name(path, is_file, folder_as_file):
+
+ # check params
+ if ((type(path) != str) or (type(is_file) != bool) or (type(folder_as_file) != bool)):
+ return None
+ path = get_path_str(path)
+
+ # reuse get_base_path() and get_file_name()
+ if ((is_file) or (is_file == False and folder_as_file)):
+ return get_file_name(get_base_path(path, True))
+ return get_file_name(get_base_path(path, False))
+
+# function to copy a file to another location
+def cp_file(src, dest):
+
+ # check params
+ if ((f_exists(src) == False) or (is_file(src) == False)):
+ return False
+
+ # depending on dest 2 things can happen
+ # - dest defines a new name for the file to create/replace
+ # - dest is just a folder
+ if (f_exists(dest) == False): # copy as a new file in that location
+ # get the base path of dest
+ base_path = get_base_path(dest, True)
+ # create the base path if it does not exist
+ if (f_exists(base_path) == False):
+ os.makedirs(base_path)
+ # copy the file to the directory
+ shutil.copy(src, base_path + "/" + get_file_name(dest))
+ elif (f_exists(dest) == True and is_file(dest)):
+ # get the base path of dest
+ base_path = get_base_path(dest, True)
+ # remove the file at dest
+ os.remove(dest)
+ # copy the file in src to dest
+ shutil.copy(src, base_path + "/" + get_file_name(dest))
+ elif (f_exists(dest) == True and is_folder(dest)):
+ # copy the file in src to dest
+ shutil.copy(src, dest + "/" + get_file_name(src))
+
+ # done!
+ return True
+
+# function to return a folder tree (file/folders)
+def list_folder_tree(src):
+
+ # check params
+ if (type(src) != str or f_exists(src) == False):
+ return []
+
+ # get the list of all files inside the mod folder first (files/folders)
+ # infinite loop moment
+ f_list = [src]
+ tmp_list = []
+ while (True):
+ # reset tmp_list
+ tmp_list = []
+ # add the new files in f_list folders
+ # that are not present in it to tmp_list
+ for f in f_list:
+ # add new folder/file
+ if (f not in tmp_list):
+ tmp_list.append(f)
+ # if f is a folder check its contents so they can be added to tmp_list
+ if (is_folder(f)):
+ for int_f in os.listdir(f):
+ # add new folder/file
+ if ((f + "/" + int_f) not in tmp_list):
+ tmp_list.append(f + "/" + int_f)
+ # when there is nothing more new added to tmp_list end the infinite loop
+ if (f_list == tmp_list):
+ break
+ # otherwise keep adding the mising files
+ f_list = tmp_list
+ # ^ I honestly wasn't expecting this loop to work at first lolll
+ return f_list
+
+# function to copy a folder to another folder (a file like copy)
+def cp_folder(src, dest, treat_as_file):
+
+ # check params
+ if ((f_exists(src) == False) or (is_folder(src) == False)
+ or (type(dest) != str) or (type(treat_as_file) != bool)):
+ return False
+
+ # check the existence of dest
+ if (f_exists(dest) == False):
+ os.makedirs(dest)
+
+ # check if src is to be treated as a file (i.e. copy the folder as well and not just its contents)
+ if (treat_as_file):
+ dest = dest + "/" + get_base_folder_name(src, False, True)
+ if (f_exists(dest) == False):
+ os.makedirs(dest)
+
+ # get the list of all files inside the mod folder first (files/folders)
+ # infinite loop moment
+ f_list = list_folder_tree(src)
+
+ # start copying the files
+ for f in f_list:
+ dest_f_path = dest + "/" + f.replace(src, "")
+ if (is_file(f)):
+ cp_file(f, dest_f_path)
+ elif (is_folder(f) and (is_folder(dest_f_path) == False)):
+ os.makedirs(dest_f_path)
+
+ # done!
+ return True
+
+# function to delete a file
+def rm_file(path):
+
+ # check params
+ if (type(path) != str or f_exists(path) == False or is_file(path) == False):
+ return False
+
+ # remove the file
+ os.remove(path)
+ return True
+
+# function to delete a folder with/without contents, don't care if the folder does not exist
+def rm_folder(path):
+
+ # check params
+ if (type(path) != str or f_exists(path) == False or is_folder(path) == False):
+ return False
+
+ # remove the folder (get the tree list)
+ f_list = list_folder_tree(path)
+ for i in range(len(f_list) - 1, -1, -1):
+ if (is_file(f_list[i])):
+ rm_file(f_list[i])
+ elif (is_folder(f_list[i])):
+ os.rmdir(f_list[i])
+
+ # done!
+ return True
+
+# function to get the size of a file
+def get_file_size(path):
+
+ # check params
+ if (is_file(path) == False):
+ return 0
+ return os.path.getsize(get_path_str(path))