@@ -213,23 +213,32 @@ def is_drive_removable(letter_or_path: str) -> bool:
213213
214214def get_volume_serial (letter_or_path : str ) -> str :
215215 if platform .system () == "Windows" :
216- buf_name = ctypes .create_unicode_buffer (256 )
217- vol_serial = ctypes .c_uint ()
218- max_comp_len = ctypes .c_uint ()
219- fs_flags = ctypes .c_uint ()
220- fs_name = ctypes .create_unicode_buffer (256 )
221- ctypes .windll .kernel32 .GetVolumeInformationW (
222- f"{ letter_or_path } :\\ " ,
223- buf_name ,
224- ctypes .sizeof (buf_name ),
225- ctypes .byref (vol_serial ),
226- ctypes .byref (max_comp_len ),
227- ctypes .byref (fs_flags ),
228- fs_name ,
229- ctypes .sizeof (fs_name ),
230- )
231- if vol_serial .value :
232- return f"{ vol_serial .value :08X} "
216+ try :
217+ buf_name = ctypes .create_unicode_buffer (256 )
218+ vol_serial = ctypes .c_uint ()
219+ max_comp_len = ctypes .c_uint ()
220+ fs_flags = ctypes .c_uint ()
221+ fs_name = ctypes .create_unicode_buffer (256 )
222+ result = ctypes .windll .kernel32 .GetVolumeInformationW (
223+ f"{ letter_or_path } :\\ " ,
224+ buf_name ,
225+ ctypes .sizeof (buf_name ),
226+ ctypes .byref (vol_serial ),
227+ ctypes .byref (max_comp_len ),
228+ ctypes .byref (fs_flags ),
229+ fs_name ,
230+ ctypes .sizeof (fs_name ),
231+ )
232+ if result and vol_serial .value :
233+ logger .debug (
234+ f"获取卷序列号成功(GetVolumeInformationW):{ letter_or_path } : -> { vol_serial .value :08X} "
235+ )
236+ return f"{ vol_serial .value :08X} "
237+ logger .debug (
238+ f"GetVolumeInformationW 返回失败或序列号为空:{ letter_or_path } :, result={ result } "
239+ )
240+ except Exception as e :
241+ logger .warning (f"GetVolumeInformationW 异常:{ letter_or_path } :, { e } " )
233242 # 尝试获取卷GUID作为备用唯一标识
234243 try :
235244 buf = ctypes .create_unicode_buffer (64 )
@@ -238,9 +247,17 @@ def get_volume_serial(letter_or_path: str) -> str:
238247 )
239248 if ok :
240249 guid = buf .value # 形如 "\\\\?\Volume{GUID}\""
250+ logger .debug (
251+ f"获取卷GUID成功:{ letter_or_path } : -> { guid .strip ().upper ()} "
252+ )
241253 return guid .strip ().upper ()
242- except Exception :
243- pass
254+ logger .debug (
255+ f"GetVolumeNameForVolumeMountPointW 返回失败:{ letter_or_path } :"
256+ )
257+ except Exception as e :
258+ logger .warning (
259+ f"GetVolumeNameForVolumeMountPointW 异常:{ letter_or_path } :, { e } "
260+ )
244261 # 最终回退:QueryDosDevice 映射路径的哈希
245262 try :
246263 size = 256
@@ -253,9 +270,12 @@ def get_volume_serial(letter_or_path: str) -> str:
253270 .hexdigest ()
254271 .upper ()
255272 )
273+ logger .debug (f"使用设备路径哈希:{ letter_or_path } : -> { h [:16 ]} " )
256274 return f"DEV-{ h } "
257- except Exception :
258- pass
275+ logger .debug (f"QueryDosDeviceW 返回失败:{ letter_or_path } :" )
276+ except Exception as e :
277+ logger .warning (f"QueryDosDeviceW 异常:{ letter_or_path } :, { e } " )
278+ logger .warning (f"所有方法均失败,返回默认值:{ letter_or_path } : -> 00000000" )
259279 return "00000000"
260280 else : # Linux
261281 try :
@@ -289,13 +309,13 @@ def get_volume_serial(letter_or_path: str) -> str:
289309
290310def get_volume_label (letter_or_path : str ) -> str :
291311 if platform .system () == "Windows" :
292- buf_name = ctypes .create_unicode_buffer (256 )
293- vol_serial = ctypes .c_uint ()
294- max_comp_len = ctypes .c_uint ()
295- fs_flags = ctypes .c_uint ()
296- fs_name = ctypes .create_unicode_buffer (256 )
297312 try :
298- ctypes .windll .kernel32 .GetVolumeInformationW (
313+ buf_name = ctypes .create_unicode_buffer (256 )
314+ vol_serial = ctypes .c_uint ()
315+ max_comp_len = ctypes .c_uint ()
316+ fs_flags = ctypes .c_uint ()
317+ fs_name = ctypes .create_unicode_buffer (256 )
318+ result = ctypes .windll .kernel32 .GetVolumeInformationW (
299319 f"{ letter_or_path } :\\ " ,
300320 buf_name ,
301321 ctypes .sizeof (buf_name ),
@@ -305,8 +325,13 @@ def get_volume_label(letter_or_path: str) -> str:
305325 fs_name ,
306326 ctypes .sizeof (fs_name ),
307327 )
308- return buf_name .value
309- except Exception :
328+ if result :
329+ logger .debug (f"获取卷标成功:{ letter_or_path } : -> { buf_name .value } " )
330+ return buf_name .value
331+ logger .debug (f"获取卷标失败:{ letter_or_path } :, result={ result } " )
332+ return ""
333+ except Exception as e :
334+ logger .warning (f"获取卷标异常:{ letter_or_path } :, { e } " )
310335 return ""
311336 else : # Linux
312337 try :
0 commit comments