Dart でディレクトリをインスタンス化し、そのファイルが存在する場合、そのディレクトリが実際のフォルダーなのか、それとも単なるシンボリック リンクなのかを確認するにはどうすればよいですか?
4 に答える
シンボリック リンクを認識できる方法は、パスがフル パスと異なる場合です。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;
}
私はこれをテストしていませんが、Dart で多くのシンボリックリンクを扱っていることに注意してください。これはうまくいくはずです。「/」で終わる場合pathString
は、それを削除する必要があります。私は通常、ディレクトリ リストからパスを取得することになるので、ディレクトリ構造を再帰的にたどりながら、予想されるパスを追跡します。
buildtool のブランチで、シンボリック リンクを検出し、 s およびsとともにインスタンスをストリームにlistDirectory()
送信する特別な実装を確認できます: https://github.com/dart-lang/buildtool/blob/m4/lib/src/util/ io.dartSymlink
File
Directory
FileSystemEntity.typeSync(path)
FileSystemEntityType
値の 1 つを含む を返します
FileSystemEntityType.DIRECTORY
FileSystemEntityType.FILE
FileSystemEntityType.LINK
FileSystemEntityType.NOT_FOUND
コマンドラインから何が起こっているかを確認したい場合は、ls -al DIRNAME を実行して権限セクションで「l」を確認し、出力の右側で「l」が何を指しているかを調べます。
man 1 stat も参照
Dart 自体から確認したい場合は、方法がわかりません。