Python : Windows 또는 Linux에서 Mount Point를 얻으십시오
-
16-09-2019 - |
문제
디렉토리가 드라이브의 마운트 포인트인지 확인하려면 기능이 필요합니다. 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
그러나 나는 이것을 Windows에서 어떻게 작동시키는 지 잘 모르겠습니다. 마운트 포인트가 드라이브 문자라고 가정 할 수 있습니까? Windows에 네트워크 마운트가있을 수 있다고 생각하므로 해당 마운트를 감지 할 수 있습니다.
해결책
Windows는 "Mount Points"라고 부르는 데 사용하지 않았습니다.편집하다: 지금은 아래를 참조하십시오!] 그리고 당신이 찾을 수있는 두 가지 전형적인/전통적인 구문은 드라이브 문자입니다. Z:
, 또는 그렇지 않으면 \\hostname
(두 개의 주요 백 슬래시 포함 : 신중하게 탈출하거나 사용 r'...'
Python fpr에서 그러한 문자 그대로의 표기법).
편집하다: NTFS 5.0 마운트 포인트가 지원되므로 이 게시물 그들에 대한 API는 "부서지고 잘못 문서화 된"상태에 있다고 포스트의 제목은 말합니다. 아마도 Microsoft 지원을 실행할 수 있습니다 mountvol.exe 가장 고통스러운 방법입니다. mountvol drive:path /L
지정된 경로의 장착 볼륨 이름을 방출해야합니다. mountvol
그러한 모든 마운트 (지금은 확인할 수 없기 때문에 "해야 할 것"이라고 말해야합니다). 당신은 그것을 실행할 수 있습니다 subprocess.Popen
출력을 확인하십시오.
다른 팁
마운트 포인트를 찾거나 마운트 포인트인지 판단 하시겠습니까?
그럼에도 불구하고 위에서 언급 한 바와 같이 WinXP에서는 논리 드라이브를 폴더에 매핑 할 수 있습니다.
자세한 내용은 여기를 참조하십시오. http://www.modzone.dk/forums/showthread.php?threadid=278
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.')
다음은 드라이브 문자로 가리키는 UNC 경로를 반환하는 코드입니다. 나는 이것을하는 더 매끄러운 방법이 있다고 생각하지만, 나는 나의 작은 부분에 기여할 것이라고 생각했다.
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)