2016-09-01 14 views
1

私はAccurevデポをgitリポジトリに変換するのにac2gitツールを使用しています。私は、問題がPythonファイルのos.walk()関数が実行されているときに直面している。私のプロジェクトは非常に複雑なビルドパスを持っているので、パス長がWindows 7の260制限を超えるネストされたファイルがあります。microsoft supportで提供されている回避策を試しましたが、エラーを解決していません。私はまだエラーが発生する[Winerror 3]:実際には存在するが長さの制限のためにアクセスできないファイルが見つからない。パス拡張子\?をWindows 7のpythonスクリプト

これはac2git.pyスクリプト内のコードの一部です:

def PreserveEmptyDirs(self): 
    preservedDirs = [] 
    for root, dirs, files in os.walk(self.gitRepo.path, topdown=True): 
     for name in dirs: 

      path ="\\\\?\\"+ToUnixPath(os.path.join(root, name)) 


      # Preserve empty directories that are not under the .git/ directory. 
      if git.GetGitDirPrefix(path) is None and len(os.listdir(path)) == 0: 
       filename = os.path.join(path, '.gitignore') 
       with codecs.open(filename, 'w', 'utf-8') as file: 
        #file.write('# accurev2git.py preserve empty dirs\n') 
        preservedDirs.append(filename) 
       if not os.path.exists(filename): 
        logger.error("Failed to preserve directory. Couldn't create '{0}'.".format(filename)) 
    return preservedDirs 


def ToUnixPath(path): 
rv = SplitPath(path) 
if rv is not None: 
    if rv[0] == '/': 
     rv = '/' + '/'.join(rv[1:]) 
    else: 
     rv = '/'.join(rv) 
return rv 

def SplitPath(path): 
rv = None 
if path is not None: 
    path = str(path) 
    rv = [] 
    drive, path = os.path.splitdrive(path) 
    head, tail = os.path.split(path) 
    while len(head) > 0 and head != '/' and head != '\\': # For an absolute path the starting slash isn't removed from head. 
     rv.append(tail) 
     head, tail = os.path.split(head) 
    if len(tail) > 0: 
     rv.append(tail) 
    if len(head) > 0: # For absolute paths. 
     rv.append(head) 
    if len(drive) > 0: 
     rv.append(drive) 
    rv.reverse() 
return rv 

私は長い経路長を可能にするために、「\\ \?」を付加しているが、今、私はこのエラーを取得します:

FileNotFoundError: [WinError 3] The system cannot find the path specified: '\\\\?\\C:///s/cms' 

私はPythonを初めて使いました。私はそれに取り組むための正しいアプローチが何であるか分かりません。私はWindows 7のみを使用し続ける必要があります。この問題が別の方法で解決できるかどうかのご提案ですか?

+0

インデントを修正してください。 \\?\ \の代わりに\\?\にパスの先頭を更新するとどうなりますか? – rfkortekaas

+0

同じエラーが発生します。 –

+0

c:の後ろに3つのスラッシュがあるのはなぜですか?それは1つでなければなりません。 – rfkortekaas

答えて

2

はあまり騒ぎの後、私は、「Windows APIの変換にファイルI/O機能を 『どうやら、この情報は非常に重要であるPythonコードの変更、

を作った/ \『』へ』の変換の一環として、 。次のセクションで説明するように「?\ \」プレフィックスを使用している場合を除き、NT-スタイル名に名前、

は、だから、僕は関数にこのコードを追加:

def ToUnixPath(path): 
rv = SplitPath(path) 
rv[:] = [item for item in rv if item != '/'] 
    rv = '\\'.join(rv) 
    return r"\\?"+"\\"+rv 

そして、出来た!

+0

この問題を元のリポジトリに修正したパッチ(プルリクエスト)を提出してもよろしいですか?これをWindows上で修正するのは良いことですが、Linuxの動作を変更しないようにする必要があります。 – nonsensickle

+0

@nonsensickle確かに。私はパッチを提出するつもりの世話をした後、Linux用の小切手を置く必要があります。 –

関連する問題