2008-10-30 11 views
6

कहें कि मेरे पास एक इनपुट फ़ाइल है, और एक लक्ष्य निर्देशिका है। मैं कैसे निर्धारित करूं कि इनपुट फ़ाइल एक ही हार्ड ड्राइव (या विभाजन) पर लक्षित निर्देशिका के रूप में है या नहीं?यह निर्धारित करने के लिए कि कोई निर्देशिका एक ही विभाजन पर है

मैं जो करना चाहता हूं वह एक प्रतिलिपि है अगर यह एक अलग है, लेकिन अगर यह वही है तो इसे स्थानांतरित करें। उदाहरण के लिए:

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) 

CesarB के जवाब के लिए धन्यवाद, same_partition समारोह लागू किया:

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

उत्तर

11

सी में, आप stat() का उपयोग करें और st_dev क्षेत्र की तुलना करेंगे। पायथन में, os.stat वही करना चाहिए।

+0

ध्यान दें कि यह विंडोज़ पर काम नहीं करेगा, जो सभी ड्राइव के लिए st_dev 0 के रूप में छोड़ देता है। (शायद प्रश्नकर्ता के लिए कोई मुद्दा नहीं है क्योंकि वह ओएसएक्स और लिनक्स टैग निर्दिष्ट करता है) – Brian

3

एक और तरीका "अनुमति से क्षमा मांगना बेहतर है" दृष्टिकोण - बस इसका नाम बदलने का प्रयास करें, और यदि यह विफल हो जाता है, तो उपयुक्त OSError को पकड़ें और कॉपी दृष्टिकोण को आजमाएं। अर्थात्:

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

यह लाभ यह है कि यह भी विंडोज, जहां st_dev हमेशा 0 सभी विभाजनों के लिए है पर काम करेंगे है।

ध्यान दें कि अगर आप वास्तव में कॉपी करने के लिए और उसके बाद स्रोत फ़ाइल हटाने चाहते हैं (यानी एक चाल प्रदर्शन करते हैं।), बस कॉपी के बजाय, तो shutil.move पहले से ही तुम क्या चाहते हो जाएगा:

 
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. 

[ संपादित करें] मैथ्यू शिनकेल की टिप्पणी के कारण अपडेट किया गया है कि शटल.मोव प्रतिलिपि के बाद स्रोत को हटा देगा, जो जरूरी नहीं है कि सवाल क्या है, क्योंकि सवाल सिर्फ प्रतिलिपि का उल्लेख करता है।

+0

बिल्कुल बिल्कुल वही नहीं है। ओपी मूल डिस्क को हटाना नहीं चाहता था अगर वे अलग-अलग डिस्क पर थे। –

+0

अच्छा बिंदु - मुझे वह याद आएगा। – Brian

संबंधित मुद्दे