2012-06-08 2 views
3

Я создам резервную копию каталога, расположенного на компьютере под управлением Windows 7 с Python. Мне нужно сжать его как можно больше. Я еще не решил, куда идти.Python преодолевает ограничение 255 пути + имя файла и архивирует каталог

Основная проблема заключается в том, что каталог содержит сотни файлов/каталогов внутри, как каскадный, поэтому я не вижу внутри после 255 символов пути + имя файла. Эта структура каталогов создается сторонним программным обеспечением.

Для быстрого тестирования я написал следующее для генерации папок (для имитации);

start = time.time() 
    end = time.time() - start 
    root_dir = 'C:\test' 
    os.chdir("C:\test") 
    iterate = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
    while (end<1):     
      end = time.time() - start 
      os.system("mkdir " + str(iterate)) 
      os.chdir(root_dir + "\\" + str(iterate)) 
      root_dir = os.getcwd() 

Результаты этого;

The filename or extension is too long. 
    Traceback (most recent call last): 
     File "folder_generate.py", line 21, in <module> 
     os.chdir(root_dir + "\\" + str(iterate)) 
    WindowsError: [Error 2] The system cannot find the file specified: 'c:\\Python27 
    \\ABCDEFGHIJKLMNOPQRSTUVWXYZ\\ABCDEFGHIJKLMNOPQRSTUVWXYZ\\ABCDEFGHIJKLMNOPQRSTUV 
    WXYZ\\ABCDEFGHIJKLMNOPQRSTUVWXYZ\\ABCDEFGHIJKLMNOPQRSTUVWXYZ\\ABCDEFGHIJKLMNOPQR 
    STUVWXYZ\\ABCDEFGHIJKLMNOPQRSTUVWXYZ\\ABCDEFGHIJKLMNOPQRSTUVWXYZ\\ABCDEFGHIJKLMN 
    OPQRSTUVWXYZ' 

Как было указано в другом вопросе здесь, но не ответил ясно.

У меня есть быстрый тестовый код для прохождения содержимого каталогов;

fileList = [] 
    fileSize = 0 
    folderCount = 0 
    rootdir = "c:\\test" 

    for root, subFolders, files in os.walk(rootdir): 
     folderCount += len(subFolders) 
     for file in files: 
      f = os.path.join(root,file) 
      fileSize = fileSize + os.path.getsize(f) 
      fileList.append(f) 

    print("Total Size is {0} bytes".format(fileSize)) 
    print("Total Files ", len(fileList)) 
    print("Total Folders", folderCount) 

Результаты;

 Total Size is 0 bytes 
    ('Total Files ', 0) 
    ('Total Folders', 9) 

Независимо от того, сколько папок находится в тестовой папке. Забавно, что я могу легко просматривать и создавать новую папку после 9.folder через проводник.

Я не вхожу в wind0z, поэтому я был бы признателен, если бы опытные пользователи могли помочь мне преодолеть это.

Просто архивируйте очень длинный каталог.

ответ

3

Ограничение может быть превышено с помощью subst если это основная проблема.

Взгляните на это:

Как юникод в Python (это говорит о 255 предел) - http://docs.python.org/release/3.1.5/howto/unicode.html

http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx - обратить внимание на часть Unicode ... Она объясняет, что версии Unicode ОКОН API имеют более высокие ограничения - также как это сделать.

Посмотрите на это так: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/subst.mspx?mfr=true

Взгляните на эту дискуссию - http://forums.v3.co.uk/showthread.php?t=223343

Кроме этого, если работа, что вы должны сделать, чтобы получить, и это не для вашего я могу сказать вам, что есть гораздо лучшие решения для резервного копирования, что вам нужно, чем для создания собственного с нуля.

+0

Спасибо за внимание. Однако я не могу получить «\\? \» Работу в Python. Если существует файл длиной более 260, он должен быть unicode, тогда прямое чтение через unicode должно решить проблему? subst назначит неиспользованную букву диска в папку, которая превышает 260 пределов. Я не думаю, что это подходит для таких случаев, когда есть огромное количество каскадных папок/каталогов. Все еще ищет обходной путь Python. – y33t

+0

У Havent была эта проблема раньше ... Было немного поиска в Google, и кажется, что это серьезная проблема для многих людей, которым пришлось иметь дело с этим ... Посмотрите на http://bugs.musicbrainz.org/ticket/ 5342 обсуждает это. Они даже публикуют несколько вариантов функции, чтобы сократить имя файла (def shorten_file_name) ... Они, похоже, заставляют его работать в конце. Если вам нужны ваши старые пути, я предлагаю вам запустить файловую систему и записать файл csv с записями ключевых значений, где вы сохраните все пути к вашим файлам дольше 240 символов ... Затем запустите скрипт shorten_file_names ... – reuf

+0

Это звучит как много работы, индексируя всю файловую систему, а не сырое читать файлы ... Я не могу сократить или имена файлов ни имена папок. – y33t

Смежные вопросы