5

私はWindowsでPythonコードを実行しており、すべてのファイル名とそのパスをファイルにトラバースして保存しようとしています。ただし、Windowsには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)を使用してみました#エラーの無効なパスをスローしました

修正を提案してください

4

1 に答える 1

9

ここでの問題は、相対パスを使用していることです。プレフィックスは\\?\絶対パスにのみ適用できます。ドキュメントにあるように:

これらのプレフィックスは、パス自体の一部としては使用されません。これらは、パスを最小限の変更でシステムに渡す必要があることを示しています。つまり、スラッシュを使用してパス区切り文字を表すことや、ピリオドを使用して現在のディレクトリを表すこと、または二重ドットを使用して親ディレクトリを表すことはできません。相対パスで""プレフィックスを使用することはできないため\\?\、相対パスは常に合計MAX_PATH文字に制限されます。

修正は簡単です。これの代わりに:

'\\\\?\\' + file_name

これを行う:

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

スラッシュは使用できません。余分な円記号を追加することは合法である場合とそうでない場合があります。その場合r'\\?\\'、二重の円記号を2倍にする代わりに回避できます。試してみてください(ただし、のようなドライブプレフィックスパスとのようなC:\fooUNCパスの両方をテストしてください\\server\share\bar)…しかし、上記のダブルバックスラッシュバージョンは間違いなく機能するはずです。

于 2012-11-17T01:45:19.357 に答える