win10下使用mklink命令給C盤軟件搬家


        在windows下,大多數軟件會默認安裝在C盤,即使小心翼翼地點開“自定義”->“安裝路徑”,然后把軟件安裝到其他盤,還是會有很多軟件用到的數據文件被塞到C盤,雖然可以到注冊表修改軟件默認安裝路徑以及數據存儲路徑,然而emmm...並沒有多大用處,C盤還是會被塞滿。

 

       我C盤是SanDisk的SSD,雖然128G不算少,但是我分了十多G給PrimoCache做緩存,然后又裝了很多很多的軟件,C盤被塞得滿滿當當的,這時候需要把C盤上一些文件搬到其他盤。然而C盤大都是軟件會用到的數據文件,直接Ctrl+X,Ctrl+V的話會出現很多問題,那么可不可以在搬家后給原來的路徑搞個“代理”,把路徑指向文件的實際地址?如下圖所示:

                           

接下來我們就試驗下吧,先試着用快捷方式來實現搬家:

我這里把迅雷安裝路徑下整個文件夾剪切出來,然后在原來路徑下放個快捷方式,然后雙擊桌面上的迅雷快捷方式,成功啟動,並沒有啥不妥,接下來換個方式:

   

 

把迅雷中的resources文件夾剪切出來,然后把快捷方式放進去,然后啟動迅雷,emmm。。迅雷打不開了。

 

       為什么會出現這樣的問題,很簡單,第一次操作是把迅雷整個文件夾剪切出來的,這個文件夾包含了迅雷運行的所需要的所有文件,第二次操作時,迅雷的程序找不到resources里面的文件,所以就運行不起來了,那為什么把快捷方式放這里沒有用呢。   其實是因為快捷方式本質是個.ink文件,雖然我們在資源瀏覽器雙擊這個快捷方式,可以顯示這個快捷方式指向的文件或文件夾,但是迅雷以及其它軟件會直接把這個快捷方式當做.ink文件對待,不能訪問到快捷方式指向的文件夾。因此不能簡單地使用快捷方式進行軟件搬家。

想要安全轉移文件,就需要用到mklink命令,命令格式如下:

 

 

硬鏈接

mklink [/h] "link" "target"  

      通過上述命令就可以創建從“link”路徑到“target”路徑的硬鏈接,例如在D盤根目錄下新建文本“A.txt”,然后輸入命令如下即可創建到"A.txt"的硬鏈接"B.txt":

注意:因為powershell不支持mklink命令,所以要在前面加cmd /c表示用cmd來運行該命令,路徑注意引號,可以是相對路徑也可以是絕對路徑,硬鏈接只能用於文件,不能對文件夾創建硬鏈接,不然會提示“拒絕訪問”。

       在文件資源管理器上看,“B.txt”與“A.txt”占用同樣大小的空間,其實這個數據並不用去理會,硬鏈接相當於給文件的數據多創建了一個“入口”,“A.txt”,“B.txt”指向的是硬盤中的同一塊區域,因此這兩個文件的內容是完全一樣的,編輯任何一個文件都會影響到另一文件,當刪除其中一個文件,只是刪除這個文件其中一個“入口”,要兩個文件都刪除,文件系統才會標志這塊硬盤區域上的文件被刪除。

 

符號鏈接

對文件創建符號鏈接

mklink "link" "target" 

對文件夾創建符號鏈接

mklink /D "link" "target"

        符號鏈接是在文件系統上實現的鏈接,對操作系統上大多數軟件來說是透明的,也就是說,當軟件訪問符號鏈接時,其實際上是在訪問該符號鏈接所指向的文件(夾),再次拿迅雷做例子,先把迅雷的resource文件夾剪切到D盤根目錄,然后在原來路徑建立符號鏈接:

注意:軟鏈接的創建需要管理員權限,確保cmd是管理員模式。對於文件夾的軟鏈接創建,一定要加上"/D"。通過相對路徑創建的軟鏈接在移動后無法使用,絕對路徑創建的移動后不影響使用。符號鏈接可以直接右鍵刪除,或通過rmdir命令刪除,不會影響原文件,但del命令則會把目標文件刪除。

       創建的符號鏈接顯示的類型是文件夾,實際上相當於是指向D盤真實的resource路徑的快捷方式,符號鏈接本身不占空間。  路徑映射的過程對迅雷來說是透明的,迅雷對這個符號鏈接的操作實際上是對resource文件夾的操作,因此迅雷可以正常運行。   另外,符號鏈接和目錄聯接是有快捷方式的那個箭頭的,只不過我修改了注冊表所以這里不顯示。  符號鏈接與Linux下的軟鏈接很相似,因此網上很多資料都會把ntfs的符號鏈接叫做軟鏈接。 此外,符號鏈接還可以連接遠程的路徑,命令如下:

mklink /D "D:\link" "\\123.123.0.1\D$\target"

 

目錄聯接

      “目錄聯接”只能應用於文件夾,不可用於文件。 根據網上能找到的資料顯示,對文件夾創建的“目錄聯接”與“符號鏈接”並沒有區別,一樣可以實現軟件數據的遷移。不過貌似這兩者對剪切操作有不一樣的表現。

      例如,我現在在D盤創建“文件夾A”, 在“文件夾A”里新建A.txt,然后在D盤根目錄創建一個“目錄聯接B”指向這個“文件夾A”,通過這個“目錄聯接B”,我可以訪問到A.txt;  接着我對“目錄聯接B”進行剪切操作,剪切到其它地方(C盤),發現“文件夾A”和“目錄聯接B”還是在D盤,即原來的地方,但是打開卻發現A.txt不見了,被剪切到了C盤的“文件夾B”中,也就是說對“目錄聯接”的剪切操作會影響原來的文件。

      對於這其中的機制,找了很多資料都沒提到這個問題,到stackoverflow提問又沒人回答。。。  感覺“目錄聯接”跟“符號鏈接”有點像,給文件夾里的內容提供一個“入口”即所謂的“聯接點”,剪切操作時會通過這個“聯接點”把內容剪切出來,原來的目錄和“聯接點”雖然沒有變化,但里面的內容被剪切出來了。 而“符號鏈接”的剪切操作僅僅是對這個“符號鏈接”的剪切,並不會透過這個“符號鏈接”把其內容剪切掉。 

      以上描述可能稍微有點亂,最好還是親自試驗一下。

 

數據遷移

 

        用Disk Space Fan 4對C盤進行掃描,發現Adobe的數據文件占用了1G多的空間,而這些數據根本用不着放固態浪費空間,於是可以把這個文件夾剪切到D盤合適路徑下,這個路徑由自己決定,放哪都可以。  因為這個文件夾放在“C:ProgramData”,為了方便管理我在D盤也新建了ProgramData文件夾,然后把Adobe這個文件夾剪切過來。   期間需要對文件夾的權限做下處理,因為部分軟件對文件夾設了權限,只有賦予了權限才能移動、編輯文件夾。  需要注意的是,在移動文件時要先把軟件相關的進程和服務關閉。  文件傳輸結束后輸入命令:

mklink /d "C:\ProgramData\Adobe" "D:\ProgramData\Adobe"   

以上例子只是方便理解,實際操作不太推薦使用剪切,而應該把文件夾復制過去,沒問題了再把原來文件刪除,避免數據丟失,數據無價,謹慎操作。

 

        使用 “NTFSLinksView” 這個軟件可以查看系統中的符號鏈接和目錄聯接,Symbolic Link就是符號鏈接,Junction是目錄聯接。win10下很多地方都使用的Junction,例如“開始菜單”,“我的文檔”這些目錄。

 

 

                                                      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM