2012-11-16 4 views
5

Windows에서 파이썬 코드를 실행하고 파일의 경로와 함께 모든 파일 이름을 파일에 저장하려고합니다. 그러나 Windows에는 260 자 제한이 있습니다.Python 확장 된 경로 길이를 사용하는 방법

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

@ PedroRomano 저는 거의 2 일 동안 미친 듯이 해결책을 찾고있었습니다. 많은 사람들이 이것을보고 싶어 지도록 질문을 좋아한다면 이것을 upvote하십시오. 감사합니다 – Romaan

+0

슬래시를 사용하는 경우 두 가지를 사용하지 마십시오. 백 슬래시는 (원시가 아닌) 문자열의 이스케이프 문자이기 때문에 두 배로해야하는 것은 백 슬래시입니다. 슬래시는 완전히 정상적인 문자입니다. ''////? // ''대신''//? /''을 해보고 무슨 일이 일어나는 지보십시오. – abarnert

답변

6

여기서 문제는 그 '입니다 상대 경로를 사용합니다. \\?\ 접두사는 절대 경로에만 적용 할 수 있습니다. the documentation은 다음과 같이 말합니다 :

이러한 접두사는 경로 자체의 일부로 사용되지 않습니다. 경로가 최소한의 수정만으로 시스템에 전달되어야 함을 나타냅니다. 즉, 경로 구분 기호를 나타내는 슬래시 나 현재 디렉토리를 나타내는 마침표 또는 상위 디렉토리를 나타내는 이중 점을 사용할 수 없습니다. "\\?\"접두사를 상대 경로로 사용할 수 없으므로 상대 경로는 항상 MAX_PATH 자로 제한됩니다.

수정 사항은 간단합니다. 이 대신 :

'\\\\?\\' + file_name 

이 작업을 수행 :

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

당신은 슬래시를 사용할 수 없습니다. 여분의 백 슬래시를 추가하는 것이 합법적 일 수도 있고 그렇지 않을 수도 있습니다.이 경우 이중 백 슬래시를 두 배로 만드는 대신 r'\\?\\'을 사용할 수 있습니다. 시도해보고 (그러나 드라이브 접두어가 같은 경로는 C:\foo과 UNC 경로는 \\server\share\bar과 같이 테스트해야합니다.) 그러나 위의 이중 슬래시 버전은 확실히 작동해야합니다.

+0

@abarnet wonderful ... – Romaan

+0

@abarnet : 저는 실제로 테스트에서 절대 (리터럴) 경로를 사용했습니다. @Romaan이 상대 경로를 사용한다는 것은 나에게 전혀 발생하지 않았습니다. 그것이 저를 버렸습니다. 나는'os.path.join (r '\\? \\', os.path.abspath (very_long_file_name))'이 실제로 작동한다고 생각합니다. 어쨌든 훌륭한 대답은 +1입니다. –

+1

@PedroRomano : 그의 코드에서 상대 경로가 있다는 것이 분명해야한다고 생각합니다.하지만 나에게는 분명하지 않았습니다. 나는 당신의 의견 중 하나에 대한 그의 답변 중 하나가 될 때까지주의를 기울이지 않았다. 그래서, 나도 당신에게 분명하지 않다는 것을 너무 기분 나쁘게 생각하지 않을 것입니다. 어쨌든, 우리는 결국 그것을 알아 냈습니다. – abarnert

관련 문제