def mount(drive_name): ''' Reconnects a drive as a volume. Any data on the drive is preserved. Returns the volume. ''' drive = Drive.reconnect(drive_name) inputt = drive.read_block(0) data = inputt.splitlines() length = int(data[0]) i = 1 while i < length: inputt = drive.read_block(i) data.extend(inputt.splitlines()) i+=1 i = 1 outcome = False data[len(data)-1] = data[len(data)-1].rstrip() while len(data) > (i+1): while len(data) > (i+1) and data[i+1].isdigit() == outcome: data[i] += data[i+1] data.pop(i+1) i+=1 outcome = not outcome volume = Volume(drive, data[1]) for i in range(len(data[3])): #TODO Needs better fix if data[3][i] == 120: volume.bmap[i] = b'x' volume.import_files() return volume
def mount(drive_name): ''' Reconnects a drive as a volume. Any data on the drive is preserved. Returns the volume. ''' drive = Drive.reconnect(drive_name) vol = Volume() block = drive.read_block(0).split(b'\n') volinfosize= int(bytes.decode(block[0])) volinfo =b'' volinfo+=drive.read_block(0) if volinfosize!=1: for i in range (1,volinfosize+1): volinfo+=drive.read_block(i) vol.setSize(int(bytes.decode(block[2]))) vol.setDrive(drive) bmpArr =[] bmp = bytes.decode(volinfo.split(b'\n')[3]) for i,v in enumerate(bmp): if v == 'x': bmpArr.append(1) else: bmpArr.append(0) vol.setVolInfo(volinfo) vol.setBitmapArray(bmpArr) return vol
def mount(drive_name): drive = Drive.reconnect(drive_name) allVolumeData = drive.read_block(0).decode() numOfBlocksUsed = allVolumeData.split('\n',1)[0] if int(numOfBlocksUsed)>1: for i in range(1,int(numOfBlocksUsed)): allVolumeData+=drive.read_block(i).decode() data = allVolumeData.split('\n') numOfBlocksUsed=int(data[0]) name = data[1] #dont need this numOfBlocksInDrive = int(data[2]) bitmap = data[3] rootIndex = int(data[4]) usedDrives=[False]*numOfBlocksInDrive Volume.calculate_volume_data_blocks(name, drive, rootIndex) numOfDataBlocks = Volume.calculate_volume_data_blocks(name, drive, rootIndex ) for i in range(numOfDataBlocks): usedDrives[i]=True usedDrives[rootIndex]=True volume = Volume(drive, name.encode(), rootIndex, usedDrives, numOfBlocksUsed) #read the rootdirectory rootString = drive.read_block(rootIndex).decode() root= rootString.split('\n') for i in range(len(root)): if root[i].isdigit(): if int(root[i])!=0: fileData = volume.drive.read_block(int(root[i])).decode().split('\n') for i in range(0,len(fileData)-1,3): fileName = fileData[i] fileDataLength = fileData[i+1] fileStart = fileData[i + 2] #then go into the fileStart fileDirectory = volume.drive.read_block(int(fileStart)) fileDirectory = fileDirectory.decode().split('\n') dataLocations = [] for j in range(len(fileDirectory)): if fileDirectory[j].isdigit(): dataLocations.append(fileDirectory[j]) #now that we have all the locations of the data, we can read all the locations and concatinate them dataOnFile = b'' for k in range(len(dataLocations)): dataOnFile+=volume.drive.read_block(int(dataLocations[k])) #only want the first n bits dataOnFile = dataOnFile[:int(fileDataLength)] file = volume.open(fileName.encode()) file.write(0, dataOnFile) print (file.data) #print (root) return volume '''
def test_reconnect_drive(self): blocks = 10 drive_name = 'driveC.txt' drive = Drive.format(drive_name, blocks) drive.disconnect() with self.assertRaises(IOError): Drive.reconnect('badname') drive = Drive.reconnect(drive_name) self.assertEqual(blocks * Drive.BLK_SIZE, drive.num_bytes()) name = b'reconnect volume' volume = Volume.format(drive, name) volume.unmount() with self.assertRaises(IOError): Volume.mount('driveZ') volume = Volume.mount(drive_name) self.assertEqual(1, volume.volume_data_blocks()) self.assertEqual(name, volume.name()) self.assertEqual(blocks, volume.size()) self.assertEqual(b'x--------x', volume.bitmap()) self.assertEqual(9, volume.root_index()) volume.unmount()
def mount(drive_name): ''' Reconnects a drive as a volume. Any data on the drive is preserved. Returns the volume. ''' print("mounting volume: " + str(drive_name)) volume = Volume() volume.drive = Drive.reconnect(drive_name) # volume.drive_name = drive.name # int volume.block_info_occupied_blocks_num = int(volume.drive.read_block(0).split()[0].decode()) # int volume.BLK_SIZE = volume.drive.BLK_SIZE # print("mounting: " + str(volume.drive.read_block(0))) volumeInfoByte = volume.read_block_info() volumeInfoStr = volumeInfoByte.decode().split('\n') # volume.volumeName = volumeInfoStr[1].encode() # volume.numberOfBlocks = int(volumeInfoStr[2]) # volume.bitmapStr = volumeInfoStr[3] # volume.rootDirIndex = int(volumeInfoStr[4]) # volume.rootFileList = volume.getRootFileList() # volume.openingFiles = [] print("volumeInfoStr: " + str(volumeInfoStr)) # byte volume.volume_name = volumeInfoStr[1].encode() # int volume.total_num_of_blocks = int(volumeInfoStr[2]) # str volume.bitmapStr = volumeInfoStr[3] print("mounting volume with bitmap: " + volume.bitmapStr) # int int(volumeInfoStr[4]) [s.strip() for s in content_byte.decode().split("\n") if s.strip() != ""] volume.root_files_block_index = [int(i) for i in volumeInfoStr[4].split() if i.strip() != "" and i.isdigit()] print("root_files_block_index: " + str(volume.root_files_block_index)) # array volume.rootFileList = volume.get_root_file_list() volume.openingFiles = [] return volume
class Volume: def __init__(self): self.currentDrive = None self.rootDirectory = None self.blocksAvailability = None def format(self, name): thisDrive = Drive(name) thisDrive.format() thisDrive.write_block(0, "+" + "-" * 127 + ("f:" + " " * 9 + "0000:" + "000 " * 12) * 6) global availableBlocksList availableBlocksList = ['+'] + ['-' for x in range(127)] global availableBlockIndices availableBlockIndices = list(range(1, 128)) self.currentDrive = thisDrive self.rootDirectory = Directory(self.currentDrive, None, 0, None, None) #drive, fileNum, parentBlockNum, parent, name self.blocksAvailability = thisDrive.read_block(0)[:127] def mkfile(self, path): try: nodes = path.strip('/').split('/') lastNode = self.rootDirectory for node in nodes[:-1]: lastNode = lastNode.getChild(node) except: print("Um there is some problem with your input") lastNode.addFile(nodes[-1]) def mkdir(self, path): try: nodes = path.strip('/').split('/') lastNode = self.rootDirectory for node in nodes[:-1]: lastNode = lastNode.getChild(node) except: print("Um there is some problem with your input") lastNode.addDirectory(nodes[-1]) def reconnect(self, name): self.currentDrive = Drive(name) self.rootDirectory = Directory(self.currentDrive, None, 0, None, name) self.currentDrive.reconnect() self.blocksAvailability = self.currentDrive.read_block(0)[:127] def append(self, path, data): try: nodes = path.strip('/').split('/') lastNode = self.rootDirectory for node in nodes: lastNode = lastNode.getChild(node) except: print("Um there is some problem with your input") lastNode.appendData(data) def ls(self, path): try: nodes = path.strip('/').split('/') lastNode = self.rootDirectory for node in nodes: if node != "": lastNode = lastNode.getChild(node) lastNode.list() except: print("Um there is some problem with your input") def print(self, path): try: nodes = path.strip('/').split('/') lastNode = self.rootDirectory for node in nodes: if node != "": lastNode = lastNode.getChild(node) lastNode.print() except: print("Um there is some problem with your input") def delfile(self, path): try: nodes = path.strip('/').split('/') lastNode = self.rootDirectory for node in nodes: if node != "": lastNode = lastNode.getChild(node) lastNode.delete() except: print("Um there is some problem with your input") def deldir(self, path): try: nodes = path.strip('/').split('/') lastNode = self.rootDirectory for node in nodes: if node != "": lastNode = lastNode.getChild(node) lastNode.delete() except: print("Um there is some problem with your input")