2011-02-15 88 views
1

我正在編寫一個備份腳本,它使用硬鏈接來不佔用未修改文件的空間。檢查文件系統是否支持硬鏈接

我想檢查一個給定的文件系統(如從特定目錄確定的)是否支持該腳本的開始的硬鏈接 - 否則,它可能會在中途(複製多個文件)第一個硬鏈接需要創建,導致腳本退出時出現異常(我可以通過恢復更改或將硬鏈接完全更改爲完整副本來恢復,但我並不真正想要 - 如果它是打這個問題)。

那麼,如果只有可用輸入是包含目錄位置的字符串(例如"F:\\Backups"或類似的),我該如何檢查文件系統是否支持硬鏈接?

失敗的是,有沒有一種很好的方法來檢查文件系統的類型特定目錄所在的位置?
我想可以拉出來,然後解決它是否得到支持?

+1

您可以在腳本開始的時候創建一個「虛擬」符號鏈接,如果這樣會引發您知道它不被支持? – 2011-02-15 22:13:23

+0

@Anon我敢肯定,這樣做肯定會奏效,但它並不是一種非常「乾淨」的方式。 – DMA57361 2011-02-15 22:21:10

回答

3

我想解決這個問題是這樣的:有3個替代品複製文件:

  1. 在Unix上,你可以使用os.link
  2. 在Windows上,你可以使用這樣的功能:

    def CreateHardLink(src, dst): 
        import ctypes 
        if not ctypes.windll.kernel32.CreateHardLinkA(dst, src, 0): 
         raise OSError 
    

    (免責聲明:我沒有測試它的想法是使用KERNEL32 API)

  3. 如果這一切失敗,您仍然可以製作常規文件副本(例如,使用shutil.copy2)。

然後,您可以在腳本的開頭用臨時文件測試這3個函數(以後要刪除)。這三個函數中的第一個函數成功(即第一個函數不產生Exception)是製作實際備份副本的理想選擇。

這個想法跟在strategy pattern之後,在這裏你必須選擇一個採用源文件名和目的文件名的函數,並盡力按照你想要的方式製作拷貝。

讓我再添加一件事:爲了選擇複製策略而檢測文件系統並不是一種很好的做法,就像檢測瀏覽器不是一種在Javascript中執行不同操作的好習慣一樣。嘗試使用某項功能並準備好捕獲異常或處理錯誤以產生替代結果總是最好的。

相關問題