2013-03-12 18 views
0

當我在Dart中實例化一個目錄並且該文件存在時,如何檢查目錄是真實文件夾還是僅僅是符號鏈接?在處理Directory類時如何識別Dart中的符號鏈接?

+2

不支持符號鏈接。你不能創建這些,也不能檢查一個條目是否是符號鏈接。考慮提交一個新的錯誤。 Pub包管理器使用命令行來創建符號鏈接。 – 2013-03-13 01:22:47

回答

1

如果路徑與完整路徑不同,則可以識別符號鏈接的方式。目錄沒有fullPath()fullPathSync(),但File.fullPathSync()可用於目錄。所以,你可以這樣做:

bool maybeIsSymlink(String path) { 
    var fullPath = new File(path).fullPathSync(); 
    return path != fullPath; 
} 

然而,這只是正常工作時path是絕對的,沒有它的祖先是符號鏈接。要解決,你可以得到該目錄的父目錄的完整路徑,追加目錄名和比較:

bool isSymlink(String pathString) { 
    var path = new Path(path); 

    var parentPath = path.directoryPath; 
    var fullParentPath = new File.fromPath(parentPath).fullPathSync(); 
    var expectedPath = new Path(fullParentPath).append(path.filename).toString(); 

    var fullPath = new File.fromPath(path).fullPathSync(); 

    return fullPath != expectedPath; 
} 

請注意,我沒有測試過這一點,但我在飛鏢與符號鏈接處理了很多,這應該工作。如果pathString以'/'結尾,則必須將其刪除。我通常最終會從目錄列表中獲取路徑,所以我在跟蹤目錄結構時追蹤預期路徑。

你可以看到一個特殊的listDirectory()實現檢測符號連接,並與File S和Directory S IN的一個分支在buildtool一起發送Symlink實例流:https://github.com/dart-lang/buildtool/blob/m4/lib/src/util/io.dart

+0

這就像一個魅力,謝謝你! – Swader 2013-03-13 21:43:47

0

如果您想要從命令行檢查以確認發生了什麼,請在權限部分檢查l,然後檢查它在輸出右側指向「to」的內容。

也看到男子1個STAT

如果你想檢查從內部飛鏢本身,我不知道怎麼辦。

+0

謝謝,但我需要從Dart檢查,是的。 – Swader 2013-03-13 00:10:35

0
FileSystemEntity.typeSync(path) 

返回FileSystemEntityType與價值觀

  • FileSystemEntityType.DIRECTORY
  • FileSystemEntityType.FILE
  • FileSystemEntityType.LINK
  • 之一