2012-11-16 35 views
5

Tôi đang chạy mã python trên Windows và cố gắng duyệt và lưu trữ tất cả tên tệp bằng đường dẫn của chúng trong tệp. Nhưng Windows có giới hạn 260 ký tự.Python Cách sử dụng độ dài đường dẫn mở rộng

os.chdir(self.config.Root_Directory_Path())   
    for root, dirs, files in os.walk("."): 
     file_list.extend(join(root,f) for f in files) 
    file_name_sorted = sorted(file_list) 
    #file_sorted = sorted(file_list, key=getsize) 
    #time.strftime("%m/%d/%Y %I:%M:%S %p" ,time.localtime(os.path.getmtime(file))) 
    f = open(self.config.Client_Local_Status(),'wb')   
    for file_name in file_name_sorted: 
     if (os.path.exists(file_name)): 
      #f.write((str(os.path.getmtime(file_name)) + "|" + file_name + "\n").encode('utf-8')) 
      pass 
     else: 
      print(file_name + "|" + str(len(file_name) + len(originalPath)) + "\n") 
      print(os.path.getmtime(file_name)) 
      #f.write((str(os.path.getmtime(file_name)) + "|" + file_name + "\n").encode('utf-8')) 
    f.close() 

Do lỗi, os.path.getmtime (file_name) ném một tệp ngoại lệ không tìm thấy. Làm thế nào tôi có thể khắc phục vấn đề này? Tôi đã cố gắng sử dụng //?/Nhân vật như tiền tố, như đề xuất trong

http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx

Nhưng đã không thành công trong việc sử dụng //?/Nhân vật.

tôi đã cố gắng sử dụng os.path.getmtime ("////? //" + file_name) #Threw một lỗi đường dẫn không hợp lệ

Xin gợi ý cho một sửa chữa

+0

@PedroRomano Không sao cả. Cảm ơn ... Mong một số trợ giúp – Romaan

+0

@PedroRomano Tôi đã tìm kiếm giải pháp như điên trong gần 2 ngày nay. Xin vui lòng upvote này vì vậy nếu bạn thích câu hỏi để tôi muốn nhiều người có thể nhìn thấy điều này. Cảm ơn – Romaan

+0

Nếu bạn đang sử dụng dấu gạch chéo về phía trước, đừng gấp đôi chúng như thế. Chỉ có các dấu gạch chéo ngược cần phải được tăng gấp đôi, bởi vì dấu gạch chéo ngược là ký tự thoát cho các chuỗi (không phải thô); slash là một nhân vật hoàn toàn bình thường. Hãy thử chỉ làm ''//? /'' Thay vì ''////? //'' và xem điều gì xảy ra. – abarnert

Trả lời

6

Vấn đề ở đây là bạn' đang sử dụng đường dẫn tương đối. Tiền tố \\?\ chỉ có thể được áp dụng cho đường dẫn tuyệt đối. Dưới dạng the documentation nói:

Các tiền tố này không được sử dụng như một phần của đường dẫn. Chúng cho biết đường dẫn sẽ được chuyển đến hệ thống với sửa đổi tối thiểu, có nghĩa là bạn không thể sử dụng dấu gạch chéo để biểu diễn dấu phân cách đường dẫn hoặc khoảng thời gian biểu thị thư mục hiện tại hoặc dấu chấm kép để biểu thị thư mục mẹ. Vì bạn không thể sử dụng tiền tố "\\?\" có đường dẫn tương đối, đường dẫn tương đối luôn được giới hạn trong tổng số là MAX_PATH ký tự.

Khắc phục rất đơn giản. Thay vì điều này:

'\\\\?\\' + file_name 

làm điều này:

'\\\\?\\' + os.path.abspath(file_name) 

Bạn không thể sử dụng phía trước dấu gạch chéo. Có thể hoặc có thể không hợp pháp để thêm dấu gạch chéo ngược phụ, trong trường hợp đó bạn có thể lấy đi bằng r'\\?\\' thay vì tăng gấp đôi dấu gạch chéo ngược kép. Hãy thử nó và xem (nhưng hãy chắc chắn để kiểm tra cả hai đường dẫn tiền tố như đường dẫn C:\foo và UNC như \\server\share\bar) ... Nhưng phiên bản double-backslash ở trên chắc chắn sẽ hoạt động.

+0

@abarnet tuyệt vời ... – Romaan

+0

@abarnet: Tôi thực sự luôn sử dụng một con đường tuyệt đối (theo nghĩa đen) trong các bài kiểm tra của mình. Nó không bao giờ xảy ra với tôi rằng @ Romaan sẽ sử dụng đường dẫn tương đối. Đó là những gì đã ném tôi đi. Tôi đoán 'os.path.join (r' \\? \\ ', os.path.abspath (very_long_file_name)) 'sẽ thực sự hoạt động, sau đó. Dù sao +1 cho câu trả lời xuất sắc của bạn. –

+1

@PedroRomano: Tôi cho rằng nó nên được rõ ràng từ mã của mình rằng ông đã có đường dẫn tương đối ... nhưng nó không rõ ràng với tôi. Tôi không để ý đến một trong những câu trả lời của anh ấy cho một trong những bình luận của anh. Vì vậy, tôi sẽ không cảm thấy quá xấu mà nó không rõ ràng cho bạn. Dù sao, chúng tôi đã tìm ra nó cuối cùng. – abarnert

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