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