diff options
author | Owl <isaclien9752@gmail.com> | 2025-08-21 20:07:13 -0400 |
---|---|---|
committer | Owl <isaclien9752@gmail.com> | 2025-08-21 20:07:13 -0400 |
commit | ef4d0e08b2d312bcf3034aa3ae48436f5d8b56a5 (patch) | |
tree | 88c06847d16e29acdd743066b0781fc17ebde3eb /file_ops.py | |
parent | 5fb5906f45a20652b8cbadc5657df9ca506f11db (diff) | |
download | blenxy-ef4d0e08b2d312bcf3034aa3ae48436f5d8b56a5.tar.gz blenxy-ef4d0e08b2d312bcf3034aa3ae48436f5d8b56a5.zip |
all the stuff
Diffstat (limited to 'file_ops.py')
-rw-r--r-- | file_ops.py | 239 |
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)) |