From 4952caec6cbc830ba6889d3141c1149abf163f4b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 10 Dec 2015 16:02:33 +0530 Subject: [PATCH] Dont try to use hardlinks on non-NTFS filesystems on windows --- src/calibre/utils/filenames.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/calibre/utils/filenames.py b/src/calibre/utils/filenames.py index 66a4fc44ad..9a0d77e5d0 100644 --- a/src/calibre/utils/filenames.py +++ b/src/calibre/utils/filenames.py @@ -549,13 +549,15 @@ def copyfile(src, dest): def get_hardlink_function(src, dest): if iswindows: - import win32file + import win32file, win32api + root = dest[0] + b':' try: - dt = win32file.GetDriveType(dest[:2]) + is_suitable = win32file.GetDriveType(root) not in (win32file.DRIVE_REMOTE, win32file.DRIVE_CDROM) + # See https://msdn.microsoft.com/en-us/library/windows/desktop/aa364993(v=vs.85).aspx + supports_hard_links = win32api.GetVolumeInformation(root + os.sep)[3] & 0x00400000 except Exception: - dt = win32file.DRIVE_UNKNOWN - hardlink = None if dt in (win32file.DRIVE_REMOTE, win32file.DRIVE_CDROM) else windows_fast_hardlink - hardlink = None if src[0].lower() != dest[0].lower() else hardlink + supports_hard_links = is_suitable = False + hardlink = windows_fast_hardlink if is_suitable and supports_hard_links and src[0].lower() == dest[0].lower() else None else: hardlink = os.link return hardlink