2012-11-16 15 views
5

私はWindows上でPythonコードを実行していて、パスを使ってすべてのファイル名をファイルにトラバースして格納しようとしています。しかし、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

スラッシュを使用している場合は、それを2倍にしないでください。バックスラッシュは(非生の)文字列のためのエスケープ文字であるため、二重にする必要があるのはバックスラッシュだけです。スラッシュは完全に普通の文字です。 '' ////?// ''の代わりに' '//?/''を実行して何が起こるか見てみてください。 – 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:彼のコードから、彼は相対的なパスを持っていることが明らかになっているはずですが、それは私には分かりませんでした。私はあなたのコメントの1つに彼の応答の1つまで気づかなかった。だから、あなたには分かりませんでした。とにかく、私たちはそれを最終的に考え出しました。 – abarnert

関連する問題