2012-01-11 40 views
5

Tôi đã thiết lập tập lệnh Python mô phỏng hệ điều hành. Nó có một dấu nhắc lệnh và một hệ thống tập tin ảo. Tôi đang sử dụng mô-đun để mô phỏng hệ thống tệp, là đa chiều để hỗ trợ một hệ thống phân cấp các thư mục. Tuy nhiên, tôi gặp sự cố khi triển khai lệnh 'cd'. Tôi không biết cách vào và ra khỏi các thư mục, mặc dù tôi có một nhóm nhỏ các thư mục được tạo khi bạn khởi chạy chương trình lần đầu tiên. Đây là mã của tôi:Cách triển khai hệ thống tệp ảo Python sử dụng giá đỡ

import shelve 

fs = shelve.open('filesystem.fs') 
directory = 'root' 
raw_dir = None 
est_dir = None 

def install(fs): 
    fs['System'] = {} 
    fs['Users'] = {} 
    username = raw_input('What do you want your username to be? ') 
    fs['Users'][username] = {} 

try: 
    test = fs['runbefore'] 
    del test 
except: 
    fs['runbefore'] = None 
    install(fs) 

def ls(args): 
    print 'Contents of directory', directory + ':' 
    if raw_dir: 
     for i in fs[raw_dir[0]][raw_dir[1]][raw_dir[2]][raw_dir[3]]: 
      print i 
    else: 
     for i in fs: 
      print i 

def cd(args): 
    if len(args.split()) > 1: 
     if args.split()[1] == '..': 
      if raw_dir[3]: 
       raw_dir[3] = 0 
      elif raw_dir[2]: 
       raw_dir[2] = 0 
      elif raw_dir[1]: 
       raw_dir[1] = 0 
      else: 
       print "cd : cannot go above root" 

COMMANDS = {'ls' : ls} 

while True: 
    raw = raw_input('> ') 
    cmd = raw.split()[0] 
    if cmd in COMMANDS: 
     COMMANDS[cmd](raw) 

#Use break instead of exit, so you will get to this point. 
raw_input('Press the Enter key to shutdown...') 

tôi không nhận được một lỗi, tôi chỉ không có ý tưởng làm thế nào để làm điều đó và cũng không biết những gì để tìm kiếm bên cạnh 'python hệ thống tập tin xiên', và rằng không nhận được bất cứ điều gì hữu ích.

+1

Thú vị! Bạn có nhớ chia sẻ điều này là gì không? –

+0

Tôi thiết lập mã của bạn để làm việc cho python3.x trong Eclipse của tôi ... chơi xung quanh với nó ngay bây giờ. Tôi hơi bối rối một chút. Nhưng không sao đâu. Như David đã đề cập, bạn có thể cung cấp một số ngữ cảnh không? – Bry6n

+0

Đó là vì vậy tôi có thể dùng thử. Chỉ để cho vui. – elijaheac

Trả lời

7

tôi cung cấp một số mã để giúp bạn trình bày dưới đây, nhưng trước tiên, một số lời khuyên tổng thể mà sẽ giúp bạn với thiết kế của bạn:

  • Lý do bạn đang gặp khó khăn với việc thay đổi thư mục là bạn đang đại diện biến thư mục hiện tại sai đường. Thư mục hiện tại của bạn phải giống như một danh sách, từ thư mục cấp cao nhất đến thư mục hiện tại của bạn. Một khi bạn có điều đó, bạn chỉ cần thực hiện một sự lựa chọn về cách lưu trữ các tập tin bằng cách sử dụng shelve dựa trên thư mục của họ (xem xét tất cả các khóa trong Shelve phải là chuỗi).

  • Dường như bạn đã lên kế hoạch đại diện cho hệ thống tệp như một loạt từ điển lồng nhau- một lựa chọn tốt. Nhưng lưu ý rằng nếu bạn thay đổi các đối tượng có thể thay đổi trong shelve, bạn phải a) đặt writeback thành True và b) gọi fs.sync() để đặt chúng.

  • Bạn nên cấu trúc toàn bộ hệ thống tệp của mình trong một lớp chứ không phải trong một loạt hàm. Nó sẽ giúp bạn giữ cho dữ liệu được chia sẻ của bạn được tổ chức. Các mã dưới đây không làm theo điều đó nhưng nó là giá trị suy nghĩ về.

Vì vậy, tôi đã sửa đổi cd và cũng đã viết một lệnh mkdir thô sơ cho bạn. Điều quan trọng để làm cho chúng hoạt động là, như tôi đã nói ở trên, có current_dir là một danh sách hiển thị đường dẫn hiện tại của bạn và cũng có cách dễ dàng (hàm current_dictionary) để lấy từ danh sách đó vào thư mục hệ thống tệp thích hợp.

Cùng với đó, đây là đoạn code để giúp bạn bắt đầu:

import shelve 

fs = shelve.open('filesystem.fs', writeback=True) 
current_dir = [] 

def install(fs): 
    # create root and others 
    username = raw_input('What do you want your username to be? ') 

    fs[""] = {"System": {}, "Users": {username: {}}} 

def current_dictionary(): 
    """Return a dictionary representing the files in the current directory""" 
    d = fs[""] 
    for key in current_dir: 
     d = d[key] 
    return d 

def ls(args): 
    print 'Contents of directory', "/" + "/".join(current_dir) + ':' 
    for i in current_dictionary(): 
     print i 

def cd(args): 
    if len(args) != 1: 
     print "Usage: cd <directory>" 
     return 

    if args[0] == "..": 
     if len(current_dir) == 0: 
      print "Cannot go above root" 
     else: 
      current_dir.pop() 
    elif args[0] not in current_dictionary(): 
     print "Directory " + args[0] + " not found" 
    else: 
     current_dir.append(args[0]) 


def mkdir(args): 
    if len(args) != 1: 
     print "Usage: mkdir <directory>" 
     return 
    # create an empty directory there and sync back to shelve dictionary! 
    d = current_dictionary()[args[0]] = {} 
    fs.sync() 

COMMANDS = {'ls' : ls, 'cd': cd, 'mkdir': mkdir} 

install(fs) 

while True: 
    raw = raw_input('> ') 
    cmd = raw.split()[0] 
    if cmd in COMMANDS: 
     COMMANDS[cmd](raw.split()[1:]) 

#Use break instead of exit, so you will get to this point. 
raw_input('Press the Enter key to shutdown...') 

Và đây là một cuộc biểu tình:

What do you want your username to be? David 
> ls 
Contents of directory /: 
System 
Users 
> cd Users 
> ls 
Contents of directory /Users: 
David 
> cd David 
> ls 
Contents of directory /Users/David: 
> cd .. 
> ls 
Contents of directory /Users: 
David 
> cd .. 
> mkdir Other 
> ls 
Contents of directory /: 
System 
Users 
Other 
> cd Other 
> ls 
Contents of directory /Other: 
> mkdir WithinOther 
> ls 
Contents of directory /Other: 
WithinOther 

Điều quan trọng cần lưu ý rằng đây là cho đến nay chỉ là một món đồ chơi: có vẫn còn một tấn để làm. Dưới đây là một vài ví dụ:

  • Hiện tại, chỉ có một thư mục không có tệp thông thường.

  • mkdir không kiểm tra xem thư mục đã tồn tại chưa, nó sẽ ghi đè thư mục có thư mục trống.

  • Bạn không thể ls với một thư mục cụ thể làm đối số, (như ls Users), chỉ thư mục hiện tại của bạn.

Tuy nhiên, điều này sẽ cho bạn thấy ví dụ về thiết kế để theo dõi thư mục hiện tại của bạn. Chúc may mắn!

+1

Bạn có một lỗi nhỏ trong dòng 35. Nên là 'in' Directory/"+ '/'.join(current_dir) +" không tìm thấy "'. Ngay bây giờ, thêm chuỗi và danh sách của nó – jdi

+0

Rất tiếc. Nó đã thực sự được cho là args [0] mà không được tìm thấy (tất nhiên là một chuỗi. Cảm ơn –

+1

Làm việc tốt. Tôi đã thực sự làm việc này cùng một lúc và đến với gần như cùng một cách tiếp cận :-) Mặc dù Tôi vừa tạo lệnh 'cd' để tạo thư mục trống khi đang di chuyển. Nhưng cuộc gọi tốt về thuộc tính writeback – jdi

Các vấn đề liên quan