先前討論資源和檔案系統(對映資源至磁碟位置)時, 假設專案中的所有資源都位在檔案系統中的同一位置。通常都是如此。 然而,由於在工作台中提供了鏈結資源的概念, 所以專案內的檔案和資料夾可以儲存在專案位置外的檔案系統中。
鏈結資源必須有一個專案作為它的母項資源。 它們實際上可以位在檔案系統的任意處。它們可以存在專案位置之外, 或甚至存在另一個專案之內。對於鏈結資源位置僅有幾個限制。 IWorkspace.validateLinkLocation 方法可以用來確定給定的位置適用於建立鏈結資源。
鏈結資源是使用 IFolder.createLink 或
IFile.createLink 方法建立的。
如果要依程式的方式判定給定的資源是否為鏈結資源,
您可以使用 IResource.isLinked 方法。
請注意,這個方法僅對鏈結資源,不對鏈結資源的子項傳回 true
。
除了這些用於建立鏈結資源和找出資源是否鏈結的特殊方法之外, 您還可以在操作鏈結資源時使用一般工作區 API。 在大部分情況下,鏈結資源的行為完全類似於工作區中的任何其他資源。 然而,當移動、複製或刪除鏈結資源時,會套用一些限制。 如果需要個別作業及其限制的相關資訊,請參閱 IResource 及其子類別。
當指定鏈結資源的位置時,就可以使用路徑變數。路徑變數是簡單的(字串 -> IPath)對映, 用來定義檔案系統中位置的捷徑。變數可讓您易於管理鏈結資源, 方法為減少在其中使用寫死在程式內的絕對檔案系統路徑之位置的數目。
路徑變數可以數種方法簡化使用者管理鏈結資源的作業:
本清單中的最後一個項目該得到一些解說。當使用者在專案中建立一個鏈結資源時,
鏈結資源的說明將新增至專案位置中的專案說明檔 (".project")。
使用者可以使用路徑變數,來共用專案(方法為複製專案的內容或使用儲存庫),
並重新定義變數來符合每一個個別的工作站。
舉例來說,有一個使用者可以將外部資源儲存在某個系統上的 c:\temp 之下,
另一個使用 Unix 的使用者則可以將同一資源儲存在 /home/username/tmp。
在每一個工作區上定義路徑變數(TEMP=c:\temp
和 TEMP=/home/userb/tmp)
可讓使用者解決這個差異,然後如同之前一樣與鏈結資源共用專案。
IPathVariableManager 定義用於建立、操作和解析路徑變數的 API。它同時也會提供在建立變數名稱和值之前驗證它們的方法,以及提供當路徑變數定義變更時,安裝要受到通知之接聽器的方法。 您可以使用 IWorkspace.getPathVariableManager, 取得這個類別的實例。 如果需要詳細資料,請參閱本節結尾處的程式碼範例。
IResource.getRawLocation 方法可以用來找出鏈結資源的未解析位置。亦即, 取得實際的路徑變數名稱,而不是將它解析為它的值。 如果未以路徑變數定義資源位置,getRawLocation 方法的行為完全類似於 getLocation 方法。
依程式的方式操作資源的用戶端需要明白中斷鏈結的可能性。當鏈結資源的位置不存在時,或以相對於未定義的路徑變數的位置, 指定這個位置時,就會發生中斷鏈結。當使用 IResource 通訊協定時,就會套用下列特殊情況:
null
,
因為它的位置相對於未定義的路徑變數。部分外掛程式可能無法處理鏈結資源,所以有若干機制可用來停用它們。 如果您正要撰寫一個絕對需要所有專案內容都位在專案預設位置的外掛程式, 您可以使用這些機制,來防止使用者在不想要鏈結資源出現之處建立它們。
第一個機制稱為專案本質否決。如果您定義了自己的專案本質, 您可以在本質定義中指定本質不與鏈結資源相容。底下是實行本質否決之本質定義的範例:
<extension id="myNature" name="My Nature" point="org.eclipse.core.resources.natures"> <runtime> <run class="com.xyz.MyNature"/> </runtime> <options allowLinking="false"/> </extension>
第二個防止建立鏈結資源的機制是團隊連結鉤。 如果您定義了自己的儲存庫實作,您可以利用 org.eclipse.core.resources.teamHook 延伸點,來防止在專案中建立與儲存庫類型共用的鏈結資源。 依預設,儲存庫提供者不容許專案中的鏈結資源連接至儲存庫。
如果不明白鏈結資源的舊外掛程式提供了儲存庫支援,您將無法在那些專案中建立鏈結資源。
最後,有一個喜好設定,可以用來停用整個工作區的鏈結資源。
當先前兩個否決機制按每一個專案基礎來運作時,這個喜好設定會影響工作區中的所有專案。
如果要依程式的方式設定喜好設定,請使用 ResourcesPlugin.PREF_DISABLE_LINKING
喜好設定。
請注意,即使己設定,使用者或外掛程式仍可以關閉喜好設定來置換這個值。
讓我們來看一些在程式碼中使用鏈結資源的範例。我們將從定義路徑變數開始:
IWorkspace workspace = ResourcesPlugin.getWorkspace(); IPathVariableManager pathMan = workspace.getPathVariableManager(); String name = "TEMP"; IPath value = new Path("c:\\temp"); if (pathMan.validateName(name).isOK() && pathMan.validateValue(value).isOK()) { pathMan.setValue(name, value); } else { //無效的名稱或值,擲出異常狀況或警告使用者 }
現在我們可以建立一個相對於已定義之路徑變數的鏈結資源:
IProject project = workspace.getProject("Project");//假設這項存在 IFolder link = project.getFolder("Link"); IPath location = new Path("TEMP/folder"); if (workspace.validateLinkLocation(location).isOK()) { link.createLink(location, IResource.NONE, null); } else { //無效的位置,擲出異常狀況或警告使用者 }
沒錯!現在您在工作區中具有一個位在 "c:\temp\folder" 且稱為 "Link" 的鏈結資料夾。
讓我們以這個鏈結資源上的部分程式碼片段做個結束,以說明其他方法相對於鏈結資源的行為:
link.getFullPath() ==> "/Project/Link" link.getLocation() ==> "c:\temp\folder" link.getRawLocation() ==> "TEMP/folder" link.isLinked() ==> "true" IFile child = link.getFile("abc.txt"); child.create(...); child.getFullPath() ==> "/Project/Link/abc.txt" child.getLocation() ==> "c:\temp\folder\abc.txt" child.getRawLocation() ==> "c:\temp\folder\abc.txt" child.isLinked() ==> "false"