From 758f3e1452af00ca875c10b2fe770f98a3af293b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 23 Oct 2020 20:46:44 +0530 Subject: [PATCH] Dont use win32 API function to make long paths useable as it fails on older windows --- setup/extensions.json | 2 +- src/calibre/test_build.py | 2 -- src/calibre/utils/filenames.py | 7 ++++--- src/calibre/utils/windows/winutil.cpp | 20 -------------------- 4 files changed, 5 insertions(+), 26 deletions(-) diff --git a/setup/extensions.json b/setup/extensions.json index 4638e5046c..2c9d5187de 100644 --- a/setup/extensions.json +++ b/setup/extensions.json @@ -141,7 +141,7 @@ "only": "windows", "headers": "calibre/utils/windows/common.h", "sources": "calibre/utils/windows/winutil.cpp", - "libraries": "shell32 wininet advapi32 Pathcch", + "libraries": "shell32 wininet advapi32", "cflags": "/X" }, { diff --git a/src/calibre/test_build.py b/src/calibre/test_build.py index 8f583d32ba..190157e899 100644 --- a/src/calibre/test_build.py +++ b/src/calibre/test_build.py @@ -261,8 +261,6 @@ class BuildTest(unittest.TestCase): self.assertRaises(OSError, winutil.create_mutex, 'test-mutex', False) m.close() self.assertEqual(winutil.parse_cmdline('"c:\\test exe.exe" "some arg" 2'), ('c:\\test exe.exe', 'some arg', '2')) - q = 'c:/hello/{}.txt'.format('a' * 400) - self.assertEqual(winutil.canonicalize_path(q), '\\\\?\\' + q) def test_sqlite(self): import sqlite3 diff --git a/src/calibre/utils/filenames.py b/src/calibre/utils/filenames.py index 8f340ac827..e8a75b646f 100644 --- a/src/calibre/utils/filenames.py +++ b/src/calibre/utils/filenames.py @@ -595,10 +595,11 @@ rmtree = shutil.rmtree if iswindows: + long_path_prefix = '\\\\?\\' + def make_long_path_useable(path): - if len(path) > 200: - from calibre_extensions.winutil import canonicalize_path - path = canonicalize_path(path) + if len(path) > 200 and os.path.isabs(path) and not path.startswith(long_path_prefix): + path = long_path_prefix + os.path.normpath(path) return path else: def make_long_path_useable(path): diff --git a/src/calibre/utils/windows/winutil.cpp b/src/calibre/utils/windows/winutil.cpp index 17fa709359..125cdd5e85 100644 --- a/src/calibre/utils/windows/winutil.cpp +++ b/src/calibre/utils/windows/winutil.cpp @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include @@ -725,24 +724,6 @@ get_long_path_name(PyObject *self, PyObject *args) { return ans; } -static PyObject * -canonicalize_path(PyObject *self, PyObject *args) { - wchar_raii path; - if (!PyArg_ParseTuple(args, "O&", py_to_wchar_no_none, &path)) return NULL; - size_t path_len = 0; - wchar_t *p = path.ptr(); - while (p[path_len]) { - if (p[path_len] == '/') p[path_len] = '\\'; - path_len++; - } - wchar_t *ans; - HRESULT hr = PathAllocCanonicalize(p, PATHCCH_ENSURE_IS_EXTENDED_LENGTH_PATH, &ans); - if (FAILED(hr)) return error_from_hresult(hr, "Failed to canonicalize path", PyTuple_GET_ITEM(args, 0)); - PyObject *r = PyUnicode_FromWideChar(ans, -1); - LocalFree(ans); - return r; -} - static PyObject * get_process_times(PyObject *self, PyObject *pid) { HANDLE h = INVALID_HANDLE_VALUE; @@ -1025,7 +1006,6 @@ static PyMethodDef winutil_methods[] = { M(set_handle_information, METH_VARARGS), M(get_long_path_name, METH_VARARGS), M(get_process_times, METH_O), - M(canonicalize_path, METH_VARARGS), M(get_handle_information, METH_VARARGS), M(get_last_error, METH_NOARGS), M(load_library, METH_VARARGS),