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!
Nguồn
2012-01-11 04:31:27
Thú vị! Bạn có nhớ chia sẻ điều này là gì không? –
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
Đó là vì vậy tôi có thể dùng thử. Chỉ để cho vui. – elijaheac