2008-10-30 6 views
6

입력 파일과 대상 디렉터리가 있다고 가정 해보십시오. 입력 파일이 대상 디렉토리와 동일한 하드 드라이브 (또는 파티션)에 있는지 어떻게 결정합니까?디렉터리가 같은 파티션에 있는지 확인하는 방법

내가하고 싶은 것은 파일이 다른 경우 파일을 복사하는 것이지만 동일한 경우 파일을 복사하는 것입니다. 예를 들어 : CesarB의 대답에

target_directory = "/Volumes/externalDrive/something/" 
input_foldername, input_filename = os.path.split(input_file) 
if same_partition(input_foldername, target_directory): 
    copy(input_file, target_directory) 
else: 
    move(input_file, target_directory) 

감사의 same_partition 기능이 구현 :

import os 
def same_partition(f1, f2): 
    return os.stat(f1).st_dev == os.stat(f2).st_dev 

답변

11

C에서, 당신은 stat()을 사용하고 st_dev 필드를 비교하는 것입니다. 파이썬에서는 os.stat가 동일해야합니다.

+0

Windows에서는 작동하지 않으므로 모든 드라이브에 대해 st_dev는 0으로 유지됩니다. (osX와 linux 태그를 지정했기 때문에 아마도 질문자에게는 문제가되지 않을 것입니다.) – Brian

3

또 다른 방법은 "허가보다 용서를 구하는 것이 좋습니다"입니다. 이름을 바꾸려고 시도하고 실패 할 경우 적절한 OSError을 붙잡고 복사본 접근 방식을 시도하십시오. 예 :

import errno 
try: 
    os.rename(source, dest): 
except IOError, ex: 
    if ex.errno == errno.EXDEV: 
     # perform the copy instead. 

이렇게하면 Windows에서 작동하기 때문에 모든 파티션에서 st_dev가 항상 0입니다.

 
Help on function move in module shutil: 

move(src, dst) 
    Recursively move a file or directory to another location. 

    If the destination is on our current filesystem, then simply use 
    rename. Otherwise, copy src to the dst and then remove src. 

를 [: 당신이 실제로 복사 한 다음 소스 파일을 삭제하려면 다음 shutil.move 이미 당신이 원하는 것을 할 것입니다, 단지 복사보다는, (. 즉 이동을 수행)하는 것이

주 편집] 매튜 쉰켈 (Matthew Schinckel)의 코멘트로 인해 shutil.move가 복사 후 원본을 삭제할 것이라고 언급했기 때문에 업데이트되었습니다.

+0

정확히 똑같은 것은 아닙니다. OP가 다른 디스크에있는 경우 원본을 삭제하지 않는 것으로 보입니다. –

+0

좋은 지적 - 나는 그것을 놓쳤습니다. – Brian

관련 문제