Windows: Make adding files whose total path length is greater than 260 characters via the Add books button work. Fixes #1900761 [Private bug](https://bugs.launchpad.net/calibre/+bug/1900761)

This commit is contained in:
Kovid Goyal 2020-10-23 20:25:06 +05:30
parent 74be244fd9
commit d2624dedb8
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 38 additions and 11 deletions

View File

@ -5,29 +5,34 @@
__license__ = 'GPL v3'
__copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>'
import shutil, os, weakref, traceback, tempfile, time
from threading import Thread
import os
import shutil
import tempfile
import time
import traceback
import weakref
from collections import OrderedDict
from io import BytesIO
from polyglot.builtins import iteritems, map, unicode_type, string_or_bytes
from PyQt5.Qt import QObject, Qt, pyqtSignal
from threading import Thread
from calibre import prints, as_unicode
from calibre.constants import DEBUG, iswindows, ismacos, filesystem_encoding
from calibre.customize.ui import run_plugins_on_postimport, run_plugins_on_postadd
from calibre.db.adding import find_books_in_directory, compile_rule
from calibre import as_unicode, prints
from calibre.constants import DEBUG, filesystem_encoding, ismacos, iswindows
from calibre.customize.ui import run_plugins_on_postadd, run_plugins_on_postimport
from calibre.db.adding import compile_rule, find_books_in_directory
from calibre.db.utils import find_identical_books
from calibre.ebooks.metadata import authors_to_sort_string
from calibre.ebooks.metadata.book.base import Metadata
from calibre.ebooks.metadata.opf2 import OPF
from calibre.gui2 import error_dialog, warning_dialog, gprefs
from calibre.gui2 import error_dialog, gprefs, warning_dialog
from calibre.gui2.dialogs.duplicates import DuplicatesQuestion
from calibre.gui2.dialogs.progress import ProgressDialog
from calibre.ptempfile import PersistentTemporaryDirectory
from calibre.utils import join_with_timeout
from calibre.utils.config import prefs
from calibre.utils.ipc.pool import Pool, Failure
from calibre.utils.filenames import make_long_path_useable
from calibre.utils.ipc.pool import Failure, Pool
from polyglot.builtins import iteritems, map, string_or_bytes, unicode_type
from polyglot.queue import Empty
@ -61,6 +66,10 @@ class Adder(QObject):
do_one_signal = pyqtSignal()
def __init__(self, source, single_book_per_directory=True, db=None, parent=None, callback=None, pool=None, list_of_archives=False):
if isinstance(source, str):
source = make_long_path_useable(source)
else:
source = list(map(make_long_path_useable, source))
if not validate_source(source, parent):
return
QObject.__init__(self, parent)

View File

@ -222,7 +222,14 @@ def run_file_dialog(
return ()
if parts[0] != secret:
raise Exception('File dialog failed, incorrect secret received: ' + get_errors())
ans = tuple((os.path.abspath(x.decode('utf-8')) for x in parts[1:]))
from calibre_extensions.winutil import get_long_path_name
def fix_path(x):
u = os.path.abspath(x.decode('utf-8'))
return get_long_path_name(u)
ans = tuple(map(fix_path, parts[1:]))
return ans

View File

@ -592,3 +592,14 @@ def copytree_using_links(path, dest, dest_is_parent=True, filecopyfunc=copyfile)
rmtree = shutil.rmtree
if iswindows:
def make_long_path_useable(path):
if len(path) > 200:
from calibre_extensions.winutil import canonicalize_path
path = canonicalize_path(path)
return path
else:
def make_long_path_useable(path):
return path