2012-11-16 12 views
5

मैं विंडोज पर अपना पायथन कोड चला रहा हूं और फ़ाइल में अपने पथ के साथ सभी फ़ाइल नामों को स्थानांतरित करने और स्टोर करने का प्रयास कर रहा हूं। लेकिन विंडोज़ के पास 260 वर्णों का प्रतिबंध है।पायथन विस्तारित पथ लंबाई का उपयोग कैसे करें

os.chdir(self.config.Root_Directory_Path())   
    for root, dirs, files in os.walk("."): 
     file_list.extend(join(root,f) for f in files) 
    file_name_sorted = sorted(file_list) 
    #file_sorted = sorted(file_list, key=getsize) 
    #time.strftime("%m/%d/%Y %I:%M:%S %p" ,time.localtime(os.path.getmtime(file))) 
    f = open(self.config.Client_Local_Status(),'wb')   
    for file_name in file_name_sorted: 
     if (os.path.exists(file_name)): 
      #f.write((str(os.path.getmtime(file_name)) + "|" + file_name + "\n").encode('utf-8')) 
      pass 
     else: 
      print(file_name + "|" + str(len(file_name) + len(originalPath)) + "\n") 
      print(os.path.getmtime(file_name)) 
      #f.write((str(os.path.getmtime(file_name)) + "|" + file_name + "\n").encode('utf-8')) 
    f.close() 

त्रुटि के कारण, os.path.getmtime (file_name) एक अपवाद फ़ाइल नहीं फेंकता है। मैं कैसे इस समस्या को दूर कर सकते हैं? मैं के रूप में

http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx

में सुझाव दिया लेकिन //?/चरित्र का उपयोग करने में सफल नहीं हुआ था उपसर्ग के रूप में //?/चरित्र उपयोग करने की कोशिश,।

मैं os.path.getmtime उपयोग करने की कोशिश ("//// //" + file_name) एक त्रुटि गलत पथ

#Threw कृपया एक फिक्स सुझाव है

+0

@PedroRomano कोई समस्या नहीं। धन्यवाद ... कुछ मदद के लिए तत्पर हैं – Romaan

+0

@ पेड्रोरोमानो मैं लगभग 2 दिनों के लिए पागल की तरह समाधान ढूंढ रहा हूं। अगर आप सवाल पसंद करते हैं तो कृपया इसे ऊपर उठाएं ताकि मैं चाहता हूं कि बहुत से लोग इसे देखें। धन्यवाद – Romaan

+0

यदि आप आगे स्लैश का उपयोग कर रहे हैं, तो उन्हें दोहराएं मत। यह केवल बैकस्लाश है जिसे दोगुना करने की आवश्यकता है, क्योंकि बैकस्लैश (गैर-कच्चे) तारों के लिए बचने वाला चरित्र है; स्लैश एक बिल्कुल सामान्य चरित्र है। ''/////?' के बजाय '// //?' '' करने की कोशिश करें और देखें कि क्या होता है। – abarnert

उत्तर

6

समस्या यहाँ है कि आप ' एक सापेक्ष पथ का उपयोग कर रहे हैं। \\?\ उपसर्ग केवल पूर्ण पथ पर लागू किया जा सकता है। the documentation कहता है:

ये उपसर्ग पथ के हिस्से के रूप में उपयोग नहीं किए जाते हैं। वे इंगित करते हैं कि पथ को न्यूनतम संशोधन के साथ सिस्टम में पास किया जाना चाहिए, जिसका अर्थ है कि आप मार्ग विभाजक का प्रतिनिधित्व करने के लिए आगे की स्लैश का उपयोग नहीं कर सकते हैं, या वर्तमान निर्देशिका का प्रतिनिधित्व करने की अवधि या मूल निर्देशिका का प्रतिनिधित्व करने के लिए डबल डॉट्स का उपयोग नहीं कर सकते हैं। चूंकि आप रिश्तेदार पथ के साथ "\\?\" उपसर्ग का उपयोग नहीं कर सकते हैं, सापेक्ष पथ हमेशा MAX_PATH वर्णों तक सीमित हैं।

फिक्स सरल है। इस के बजाय:

'\\\\?\\' + file_name 

ऐसा करते हैं:

'\\\\?\\' + os.path.abspath(file_name) 

आप स्लैश आगे उपयोग नहीं कर सकते। अतिरिक्त बैकस्लैश जोड़ने के लिए यह कानूनी हो सकता है या नहीं भी हो सकता है, इस मामले में आप डबल बैकस्लैश को दोगुना करने के बजाय r'\\?\\' से दूर हो सकते हैं। इसे आज़माएं और देखें (लेकिन C:\foo और \\server\share\bar जैसे यूएनसी पथ दोनों ड्राइव-प्रीफिक्स्ड पथों का परीक्षण करना सुनिश्चित करें ... लेकिन ऊपर दोगुनी बैकस्लैश संस्करण निश्चित रूप से काम करना चाहिए।

+0

@ बरनेट अद्भुत ... – Romaan

+0

@ बार्नेट: मैं वास्तव में हमेशा अपने परीक्षणों में एक पूर्ण (शाब्दिक) पथ का उपयोग करता हूं। यह मेरे लिए कभी नहीं हुआ कि @ रोमन सापेक्ष पथ का उपयोग करेगा। यही वह था जो मुझे फेंक दिया। मुझे लगता है कि os.path.join (r '\\? \\', os.path.abspath (very_long_file_name)) वास्तव में काम करेगा। वैसे भी आपके उत्कृष्ट उत्तर के लिए +1। –

+1

@ पेड्रोरोमानो: मुझे लगता है कि यह अपने कोड से स्पष्ट होना चाहिए कि उसके पास सापेक्ष पथ थे ... लेकिन यह मेरे लिए स्पष्ट नहीं था। मैंने आपकी टिप्पणियों में से किसी एक को प्रतिक्रिया देने तक ध्यान नहीं दिया। इसलिए, मुझे बहुत बुरा नहीं लगेगा कि यह आपके लिए भी स्पष्ट नहीं था। वैसे भी, हमने इसे अंततः समझ लिया। – abarnert

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