Romaan
Romaan

Reputation: 2757

Python How to use extended path length

I am running my python code on Windows and trying to traverse and store all the file name with their paths in a file. But the Windows has a restriction of 260 characters.

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()

Because of the error, os.path.getmtime(file_name) throws an exception file not found. How can I overcome this problem? I tried using //?/ character as prefix, as suggested in

http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx

But was not successful in using //?/ character.

I tried using os.path.getmtime("////?//" + file_name) #Threw an error invalid path

Please suggest a fix

Upvotes: 5

Views: 5686

Answers (1)

abarnert
abarnert

Reputation: 365617

The problem here is that you're using a relative path. The \\?\ prefix can only be applied to absolute paths. As the documentation says:

These prefixes are not used as part of the path itself. They indicate that the path should be passed to the system with minimal modification, which means that you cannot use forward slashes to represent path separators, or a period to represent the current directory, or double dots to represent the parent directory. Because you cannot use the "\\?\" prefix with a relative path, relative paths are always limited to a total of MAX_PATH characters.

The fix is simple. Instead of this:

'\\\\?\\' + file_name

do this:

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

You cannot use forward slashes. It may or may not be legal to add an extra backslash, in which case you can get away with r'\\?\\' instead of doubling the double backslash. Try it and see (but make sure to test both drive-prefixed paths like C:\foo and UNC paths like \\server\share\bar)… But the doubled-backslash version above should definitely work.

Upvotes: 9

Related Questions