2012-01-17 23 views
8

Với hai đường dẫn tôi phải so sánh nếu chúng trỏ đến cùng một tệp hay không. Trong Unix, điều này có thể được thực hiện với os.path.samefile, nhưng khi tài liệu cho biết nó không có sẵn trong Windows. Cách tốt nhất để mô phỏng chức năng này là gì? Nó không cần mô phỏng trường hợp thông thường. Trong trường hợp của tôi, có các cách đơn giản sau:Làm thế nào để mô phỏng hành vi os.path.samefile trên Windows và Python 2.7?

  • Đường dẫn không chứa liên kết tượng trưng.
  • Tệp nằm trong cùng một đĩa cục bộ.

Bây giờ tôi sử dụng như sau:

def samefile(path1, path2) 
    return os.path.normcase(os.path.normpath(path1)) == \ 
      os.path.normcase(os.path.normpath(path2)) 

là OK này?

+2

'>>> os.path.normcase (os.path.normpath (r" c: \ users \ aayoubi \ desktop ")) 'c: \\ users \\ aayoubi \\ desktop'' i cann' t tìm thấy trường hợp điều này sẽ thất bại. – aayoubi

+0

Tôi chỉ tìm thấy một ví dụ. 'c: \\ một \ hai' và 'c: \\ một \ hai \' có thể trỏ đến cùng một thư mục, nhưng phương pháp này sẽ nói chúng khác nhau. –

+1

cả hai đầu ra đều giống nhau: '>>> os.path.normcase (os.path.normpath (r" c: \\ one \ two ")) 'c: \\ one \\ two'' '>>> os.path.normcase (os.path.normpath (r" c: \\ one \ two \\ ")) 'c: \\ one \\ two'' – aayoubi

Trả lời

3

Cuộc gọi hệ thống os.stat trả về một bộ dữ liệu với rất nhiều thông tin về mỗi tệp - bao gồm cả tem tạo, thời gian sửa đổi cuối cùng, kích thước, thuộc tính tệp. Cơ hội của các tệp khác nhau có cùng các tham số rất mỏng. Tôi nghĩ rằng đó là rất phải chăng để làm:

def samefile(file1, file2): 
    return os.stat(file1) == os.stat(file2) 
+3

Tôi đoán rằng về mặt kỹ thuật, tệp có thể được sửa đổi giữa hai cuộc gọi đến stat. So sánh các đường dẫn như anh ta trong câu hỏi sẽ không có vấn đề này – Shawabawa

+0

Có, đối với các tập tin ngẫu nhiên cơ hội như vậy là rất nhỏ. Nhưng tôi có một loạt các tệp được tạo tự động và nhiều tệp có cùng kích thước và dấu thời gian. –

+0

Tôi nghĩ rằng cách tiếp cận có thể dẫn đến các lỗi khó tìm. Loại trường hợp này có thể xảy ra khi ví dụ một bộ lưu trữ giải nén rất nhiều tệp với cùng một dấu thời gian. Nếu chúng là các tệp zero-byte hơn một tệp có thể kết thúc với nhiều kết quả phù hợp sai ... –

2

Việc sử dụng hợp cụ thể thực sự của os.path.samefile không phải là liên kết tượng trưng, ​​nhưng cứng liên kết. os.path.samefile(a, b) trả về Đúng nếu ab là cả hai liên kết cứng đến cùng một tệp. Họ có thể không có cùng một con đường.

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