2016-09-01 1 views
1

Ich verwende das Tool ac2git, um mein Accurev-Depot in das git-Repository zu konvertieren. Ich stehe vor einem Problem, wenn die os.walk() - Funktion in der Python-Datei ausgeführt wird. Da mein Projekt einen ziemlich komplizierten Erstellungspfad hat, habe ich Dateien verschachtelt, die eine Pfadlänge haben, die die Beschränkung von 260 auf Windows 7 überschreitet. Ich habe versucht, die von microsoft support bereitgestellten Workarounds zu verwenden, aber es löst den Fehler nicht. Ich bekomme immer noch den Fehler [Winerror 3]: Datei nicht gefunden, obwohl es tatsächlich vorhanden ist, aber aufgrund der Längenbeschränkung nicht zugegriffen werden kann. Verwenden der Pfaderweiterung \? Für Windows 7 mit Python-Skript

Dies ist ein Teil des Codes im ac2git.py Skript:

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 

ich angehängt habe die „\\? \“, Um für längere Wegstrecken zu ermöglichen, aber jetzt bekomme ich diesen Fehler:

Ich bin neu bei Python und ich bin nicht sehr sicher, was ist der richtige Ansatz, um es anzugehen. Ich muss nur weiterhin Windows 7 verwenden. Irgendwelche Vorschläge, wenn dieses Problem anders gelöst werden kann?

+0

Bitte korrigieren Sie Ihre Einrückung. Was passiert, wenn Sie den Pfadanfang zu \\? \ Statt \\\\? \ Aktualisieren. – rfkortekaas

+0

Derselbe Fehler tritt auf. –

+0

Warum haben Sie auch 3 Schrägstriche nach c:? Es sollte eins sein. – rfkortekaas

Antwort

2

So nach viel Lärm, ich Änderungen in der Python-Code,

Offenbar sind diese Informationen sehr wichtig "Datei-I/O-Funktionen in der Windows-API-convert "/" auf "\" im Rahmen der Umwandlung . der Name auf einen Namen NT-Stil, mit Ausnahme bei der Verwendung des "? \ \" Präfix wie in den folgenden Abschnitten beschrieben "

Also habe ich nur diesen Code auf die Funktion hinzugefügt:

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

Und es funktionierte!

+0

Würde es Ihnen etwas ausmachen, einen Patch (Pull Request) zu senden, der dieses Problem im ursprünglichen Repository behebt? Es wäre schön, wenn dies unter Windows behoben wäre, aber Sie müssen sicherstellen, dass Sie die Funktionsweise von Linux nicht ändern. – nonsensickle

+0

@nonsensickle sicher. Ich muss nach Linux suchen, nachdem ich mich darum gekümmert habe, werde ich einen Patch einreichen. –