2017-07-11 30 views
3

WindowsError:[エラー3]パスが見つかりません指定された(?パスが長すぎます)WindowsError:[エラー3]指定されたパスが見つかりません(ときのパスが長すぎる?)

I 2つのディレクトリ間で一意のファイルを見つけるためのスクリプトを作成しています。これを行うために、私はos.walk()を使用してファイルを処理し、同じサイズのファイルが存在する場合は、それらが同じであることを確認するためにハッシュします(プロセス内のファイルを開きます)。問題は、ファイルを開いたときに上記のエラーが発生することです。この問題が発生する最も一般的な理由は、パスが正しく結合されていないために、スクリプトが存在しないファイルを開こうとするためです。これは私には当てはまりません。

さまざまなディレクトリの組み合わせを試した後、エラーが発生したファイルに深いディレクトリ構造と長いファイル名があるように見えるパターンに気付き始めました。私はこの問題の他の理由を考えることはできません。文字エンコーディングのエラーはありません。私はすべてのパスをUTF-8にデコードします。パスはos.walk()によって存在します。

マイ徒歩コード:

for root, dirs, files in os.walk(directory): 
    for filename in files: 
     file_path = os.path.join(root, filename) 

私のハッシュコード:

def hash(file_path): 
    with open(dir_file, 'rb') as f: 
     hasher = hashlib.md5() 
     while True: 
      buf = f.read(byte_size) 
      if buf != '': 
       hasher.update(buf) 
      else: 
       break 
     result = hasher.hexdigest() 
    return result 

編集:問題が登場し、最新のパスは、二重の会計142個の文字を含む深い5つのディレクトリ(でしたバックスラッシュ)、ファイル名はさらに122文字です

答えて

1

これはWindows APIファイルのパスs MSDNに説明したように制限をIZE:

In the Windows API (with some exceptions discussed in the following paragraphs), the maximum length for a path is MAX_PATH, which is defined as 260 characters. A local path is structured in the following order: drive letter, colon, backslash, name components separated by backslashes, and a terminating null character. For example, the maximum path on drive D is "D:\some 256-character path string" where "" represents the invisible terminating null character for the current system codepage. (The characters < > are used here for visual clarity and cannot be part of a valid path string.)

としても、そのページに説明し、Windowsサポートの拡張ファイルパス接頭辞の新しいバージョン(\\?\)はUnicodeのパスと、そのようなのために使用されるが、それはそれすなわち、一貫したまたは保証行動ではありませんすべてのケースでうまくいくとは限りません。

いずれかの方法で、拡張されたパス接頭辞を使用してパスを付加しようとすると、それはあなたのケースのために働くかどうかを確認:

file_path = "\\\\?\\" + os.path.join(root, filename) 
関連する問題