Python, 基於單鏈表實現簡單的PFS文件管理系統

Github: https://github.com/11ze/python-pfs-file

實現功能:

  • open  打開指定的本地文件
  • put     讀取本地的文件到文件系統中get    指定文件系統的文件保存到本地
  • get     指定文件系統的文件保存到本地
  • rm      指定刪除文件系統的文件
  • kill      指定刪除本地的文件
  • quit    退出文件系統並保存系統中的所有文件內容到open打開的文件中

 

預覽圖:

 

代碼實現: 

#!/usr/bin/python3
# -*- coding:utf-8 -*-

import time
import os
import os.path

class Node(object):
    """定義類來描述指針"""
    def __init__(self, name, changeTime='', size='', data='', p=None):
        self.name = name               # 文件名
        self.changeTime = changeTime   # 修改時間
        self.size = size               # 文件大小
        self.data = data               # 文件內容
        self.next = p


class LinkList(object):
    """單鏈表"""

    def __init__(self):
        self.head = None

    # 初始化單鏈表
    def create(self, data):
        self.head = Node(data[0])
        p = self.head
        for i in data[1:]:
            p.next = Node(i)
            p = p.next

    # 獲取單鏈表的長度
    def len(self):
        p = self.head
        length = 0
        while p != None:
            length += 1
            p = p.next
        return length

    # 判斷單鏈表是否爲空
    def is_empty(self):
        return self.len() == 0

    def add(self, name, changeTime, size, data):
        temp = Node(name, changeTime, size, data)
        if self.is_empty():
            self.head = temp
        else:
            temp.next = self.head
            self.head = temp

    # 獲取單鏈表指定位置的數據
    def getItem(self, index):
        if self.is_empty():
            print("單鏈表爲空")
            return
        if index >= self.len() or index < 0:
            print("索引超過單鏈表長度")
            return
        p = self.head
        count = 0
        while count != index:
            p = p.next
            count += 1
        return p.data

    # 獲取單鏈表指定元素的索引
    def find(self, item):
        p = self.head
        index = 0
        while p != None:
            if p.name == item:
                return index
            p = p.next
            index += 1

    # 刪除單鏈表指定位置的元素
    def delete(self, index):
        if self.is_empty():
            #print("單鏈表爲空")
            return
        if index >= self.len() or index < 0:
            #print("索引超過單鏈表長度")
            return
        if index == 0:
            self.head = self.head.next
        else:
            p = self.head
            count = 0
            while count < index-1:
                p = p.next
                count += 1
            p.next = p.next.next

    # 打印單鏈表, 也就是在文件系統中的文件內容
    def print(self):
        p = self.head
        while p != None:
            print(p.name + '\t' + str(int(p.size/1024)+1) + 'KB\t' + p.changeTime)
            p = p.next

    # 指定文件系統的文件保存到本地
    def getFile(self, index):
        p = self.head
        count = 0
        while count < index-1:
            p = p.next
            count += 1
        with open(p.name, 'w+') as f:
            f.write(p.data)

    # 退出文件系統並保存系統中的所有文件內容到open打開的文件中
    def saveFile(self, filename):
        with open(filename, 'w+') as f:
            p = self.head
            while p != None:
                data = p.name + '\n' + str(p.size) + '\n' + p.changeTime + '\n' + p.data
                f.write(data)
                p = p.next

# 打開指定的本地文件
def readFile(fileName):
    global filename
    filename = fileName
    with open(fileName, 'w+') as f:
        pass

# 保存文件系統中所有的文件到本地
def saveFile(filename):
    L.saveFile(filename)

# 檢查本地是否有該文件, 有則讀取到文件系統中
def PUT(fileName):
    if (os.path.exists(fileName)):
        fsize = os.path.getsize(fileName)
    else:
        print('open file error.\n')
        return

    with open(fileName, 'r') as f:
        data = f.read()
        changeTime = time.strftime('%a %b %H:%M:%S %Y',time.localtime(time.time()))
        L.add(fileName, changeTime, fsize, data)

# 檢查文件系統中是否有該文件, 有則保存到本地
def GET(fileName):
    index = L.find(fileName)
    if index is None:
        print('file not exist.\n')
        return
    L.getFile(index)

# 指定刪除文件系統的文件
def RM(fileName):
    index = L.find(fileName)
    L.delete(index)

# 指定刪除本地的文件
def KILL(fileName):
    if (os.path.exists(fileName)):
        fsize = os.path.getsize(fileName)
        os.remove(fileName)
    else:
        print('kill file error.\n')
        
    return

L = LinkList()

filename = ''

while True:
    arg = input('PFS>').strip()
    # 將獲取到的命令行輸入拆分
    arg = arg.split(' ', 1)
    arg1 = arg[0]
    flag = 0    # 用於有沒有傳入命令參數   0:沒有 1:有
    if len(arg) >= 2:
        arg2 = arg[1].strip()
        flag = 1

    if arg1 == 'open':
        readFile(arg2)
        fileName = arg2
    elif arg1 == 'put':
        PUT(arg2)
    elif arg1 == 'get':
        if (flag == 0):
            print('file not exist.\n')
        else:
            GET(arg2)
    elif arg1 == 'rm':
        if (flag == 0):
            print('file not exist.\n')
        else:
            RM(arg2)
    elif arg1 == 'dir':
        L.print()
    elif arg1 == 'kill':
        if (flag == 0):
            print('kill file error.\n')
        else:
            KILL(arg2)
    elif arg1 == 'quit':
        break
    else:
        print('command input error.\n');

# 退出文件系統並保存系統中的所有文件內容到open打開的文件中
if filename != '':
    saveFile(filename)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章