2009-07-16 31 views
5

Tôi cần một chức năng để xác định xem thư mục có phải là điểm gắn kết cho một ổ đĩa hay không. tôi tìm thấy mã này đã có hoạt động tốt cho Linux:Python: Nhận Điểm trên Windows hoặc Linux

def getmount(path): 
    path = os.path.abspath(path) 
    while path != os.path.sep: 
    if os.path.ismount(path): 
     return path 
    path = os.path.abspath(os.path.join(path, os.pardir)) 
    return path 

Nhưng tôi không chắc chắn làm thế nào tôi sẽ có được điều này để làm việc trên cửa sổ. Tôi có thể giả định điểm gắn kết là ký tự ổ đĩa (ví dụ: C :) không? Tôi tin rằng nó có thể có một mạng gắn kết trên cửa sổ vì vậy tôi muốn có thể phát hiện rằng gắn kết là tốt.

+1

Có thể có một ổ đĩa được gắn vào đường dẫn trong ổ đĩa trong cửa sổ. Tôi tưởng tượng bạn sẽ phải tìm trong pywin32 để có ý tưởng tốt hơn về cách thực hiện điều này. –

Trả lời

3

Windows không sử dụng để gọi chúng là "điểm gắn kết" [chỉnh sửa: hiện tại, xem bên dưới!] Và hai cú pháp điển hình/truyền thống mà bạn có thể tìm thấy là ký tự ổ đĩa, ví dụ: Z:, hoặc else \\hostname (với hai dấu gạch chéo ngược hàng đầu: thoát một cách cẩn thận hoặc sử dụng ký hiệu r'...' trong Python fpr chuỗi chữ như vậy).

chỉnh sửa: vì điểm gắn kết NTFS 5.0 được hỗ trợ, nhưng theo this post API cho chúng ở trạng thái khá "bị hỏng và không có tài liệu", tiêu đề của bài đăng cho biết. Có thể thực thi cách cung cấp vi-rút mountvol.exe do microsoft cung cấp ít nhất - mountvol drive:path /L phải phát ra tên ổ đĩa được gắn cho đường dẫn đã chỉ định hoặc chỉ mountvol danh sách như vậy tất cả các gắn kết đó (tôi phải nói "nên" vì tôi không thể kiểm tra ngay bây giờ). Bạn có thể thực hiện nó với subprocess.Popen và kiểm tra đầu ra của nó.

+0

Nó * là * có thể có ổ đĩa được gắn trong ổ khác (mặc dù tôi không chắc đó có phải là thuật ngữ chính xác hay không). –

+0

Đúng, đó là, hãy để tôi chỉnh sửa cho phù hợp. –

3

Bạn có muốn tìm điểm gắn kết hoặc chỉ xác định xem đó có phải là điểm lắp không?

Bất kể, như đã nhận xét ở trên, có thể trong WinXP ánh xạ ổ đĩa logic đến một thư mục.

Xem ở đây để biết chi tiết: http://www.modzone.dk/forums/showthread.php?threadid=278

tôi sẽ cố gắng win32api.GetVolumeInformation

>>> import win32api 
>>> win32api.GetVolumeInformation("C:\\") 
    ('LABEL', 1280075370, 255, 459007, 'NTFS') 
>>> win32api.GetVolumeInformation("D:\\") 
    ('CD LABEL', 2137801086, 110, 524293, 'CDFS') 
>>> win32api.GetVolumeInformation("C:\\TEST\\") # same as D: 
    ('CD LABEL', 2137801086, 110, 524293, 'CDFS') 
>>> win32api.GetVolumeInformation("\\\\servername\\share\\") 
    ('LABEL', -994499922, 255, 11, 'NTFS') 
>>> win32api.GetVolumeInformation("C:\\WINDOWS\\") # not a mount point 
    Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    pywintypes.error: (144, 'GetVolumeInformation', 'The directory is not a subdirectory of the root directory.') 
+0

NB rằng win32api là từ một gói cài đặt riêng biệt http://sourceforge.net/projects/pywin32/files/ Cảm ơn câu trả lời của bạn - nó cũng dẫn tôi khám phá cách để có được đĩa DVD tite – rogerdpack

0

Dưới đây là một số mã để trả lại đường dẫn UNC được trỏ đến bởi một ký tự ổ đĩa. Tôi cho rằng có một cách khéo léo hơn để làm điều này, nhưng tôi nghĩ tôi sẽ đóng góp phần nhỏ của mình.

import sys,os,string,re,win32file 
for ch in string.uppercase: # use all uppercase letters, one at a time 
    dl = ch + ":" 
    try: 
     flds = win32file.QueryDosDevice(dl).split("\x00") 
    except: 
     continue 
    if re.search('^\\\\Device\\\\LanmanRedirector\\\\',flds[0]): 
     flds2 = flds[0].split(":") 
    st = flds2[1] 
    n = st.find("\\") 
    path = st[n:] 
     print(path) 
Các vấn đề liên quan