def find_file(filename:str, file_path_list:list, FCB = {}, disk_data = [], FAT = [], now_path = ''):
    search_path = 'C:'
    temp_path = ''
    position = -1
    target_FCB = {}
    ret = ''
    # 设置8字节全为0的列表
    empty_list = bytes([0]*8)
    filename_list = filename.split('.')

    if now_path == '':
        now_path = search_path
    else:
        temp_path = now_path
    if FCB != {}:
        target_FCB = FCB
    if disk_data == []:
        disk_data = disk_open(search_path)

        # 获取FAT
        FAT = []
        for i in range(128):
            FAT.append(disk_data[i])

    file_FCB_bytes_list = FO.get_path_allFCB_bytes(now_path, disk_data, target_FCB, FAT)
    # 将文件名转换成字节型
    if len(filename_list) == 1:
        filename_bytes = FO.filename_to_bytes(filename_list, 0)
    else:
        filename_bytes = FO.filename_to_bytes(filename_list)

    for i in range(len(file_FCB_bytes_list)):
        # 如果找到此文件
        if file_FCB_bytes_list[i][0:5] == filename_bytes:
            position = i
            ret = temp_path + '/' + filename
            file_path_list.append(ret)
           


    for i in range(len(file_FCB_bytes_list)):
        # 如果找到一个文件目录
        if file_FCB_bytes_list[i] != empty_list and bytes_to_FCB(file_FCB_bytes_list[i])['File_class'] == 0:
            position = i
            # 获取目标文件的字节型FCB并转换格式
            target_FCB_bytes = file_FCB_bytes_list[position]
            target_FCB = bytes_to_FCB(target_FCB_bytes)
            temp_path = temp_path + '/' + str(target_FCB['File_name']).split()[0]
            ret = find_file(filename, file_path_list, target_FCB, disk_data, FAT, temp_path)
            if ret != False:
                break

    return ret
def search_file_FCB(path:str, start_block:int = -1) -> list:
    search_path = 'C:'
    temp_path = ''
    position = -1
    target_FCB = {}
    dir_list = []
    # 设置8字节全为0的列表
    empty_list = bytes([0]*8)

    new_path = path.split('/')[0:-1][-1]
    print(new_path)
    if start_block != -1:
        target_FCB = {
            'File_name' : '',               # 3B
            'File_type' : '',               # 2B
            'Disk_startblock' : start_block,          # 1B    0~255
            'File_size' : 0,                # 1B    0~255   最大存储相当4个磁盘块大小的文件
            'File_class' : 0
        }
    
    disk_data = disk_open(search_path)

    # 获取FAT
    FAT = []
    for i in range(128):
        FAT.append(disk_data[i])

    file_FCB_bytes_list = FO.get_path_allFCB_bytes(new_path, disk_data, target_FCB, FAT)

    for i in range(len(file_FCB_bytes_list)):
            position = i
            # 获取目标文件的字节型FCB并转换格式
            target_FCB_bytes = file_FCB_bytes_list[position]
            target_FCB = bytes_to_FCB(target_FCB_bytes)
            
            dir_list.append(target_FCB)
    return dir_list
def read_disk(filepath_list:list, filename_list:list, disk_data, FAT:list):
    
    position = -1
    next_pointer = 1                 # 文件路径中指向文件目录的指针
    folder_name_list = filepath_list
    temp_data_list = []
    temp_FCB = {}
    
    # 获取根目录下所有字节型FCB
    data_list = FO.get_path_allFCB_bytes(folder_name_list[next_pointer - 1], disk_data)
    # 如果在根目录
    
    if next_pointer == len(folder_name_list):
            # 获取此目录下所有字节型FCB
            temp_data_list = data_list
    else:
        # 将文件名转换成字节型
        filename_bytes = FO.filename_to_bytes(folder_name_list[next_pointer], 0)
        for i in range(8):
            # 如果找到此文件
            if data_list[i][0:5] == filename_bytes:
                position = i
                break
        # 获取目标文件的字节型FCB并转换格式
        FCB_bytes = data_list[position]
        target_FCB = bytes_to_FCB(FCB_bytes)
        temp_FCB = target_FCB
        # 获取目标文件FCB中起始盘块号
        start_position = get_FCB_block_num(target_FCB)
        #获取当前起始盘块号
        now_start_block_num = start_position
        # 文件目录指针指向文件路径中下一个文件目录
        next_pointer = next_pointer + 1

        while(next_pointer < len(folder_name_list)):
            data_list = []
            # 获取此目录下所有字节型FCB
            data_list = FO.get_path_allFCB_bytes(folder_name_list[next_pointer], disk_data, temp_FCB, FAT)

            temp_data_list = data_list

            # 将文件目录名转成字节
            filename_bytes = FO.filename_to_bytes(folder_name_list[next_pointer], 0)
            for i in range(len(data_list)):
            # 如果找到此文件
                if data_list[i][0:5] == filename_bytes:
                    position = i
                    break

            # 获取目标文件的字节型FCB并转换格式
            FCB_bytes = data_list[position]
            target_FCB = bytes_to_FCB(FCB_bytes)
            temp_FCB = target_FCB
            # 获取目标文件FCB中起始盘块号
            start_position = get_FCB_block_num(target_FCB)
            #获取当前起始盘块号
            now_start_block_num = start_position
            # 文件目录指针指向文件路径中下一个文件目录
            next_pointer = next_pointer + 1

        # 获取此目录下所有字节型FCB
        data_list = FO.get_path_allFCB_bytes(folder_name_list[next_pointer-1], disk_data, temp_FCB, FAT)

        temp_data_list = data_list
    
    #==============================
    
    data_list = temp_data_list
    
    '''
    data_list = []
    # 获取此目录下所有字节型FCB
    data_list = FO.get_path_allFCB_bytes(filepath_list, disk_data)
    '''
    # 将文件名转换成字节型
    
    filename_bytes = FO.filename_to_bytes(filename_list)
    
    for i in range(len(data_list)):
        # 如果找到此文件
        if data_list[i][0:5] == filename_bytes:
            position = i
            
            break
    
    # 获取目标文件的FCB
    FCB_bytes = data_list[position]
    #print(position)
    target_FCB = bytes_to_FCB(FCB_bytes)
    #print(target_FCB)
    # 获取目标文件FCB中起始盘块号
    start_position = get_FCB_block_num(target_FCB)
    # 获取文件长度
    target_size = target_FCB['File_size']

    # 获取文件存储所在的所有块
    FAT_list = []
    FAT_list.append(start_position)
    for i in range(start_position, 128):
        if FAT[i] == 129:
            break
        else:
            FAT_list.append(FAT[i])
    
 
    connect = read_file_connect(start_position, target_size, FAT, disk_data)
    return connect