ここで説明するように、FindFirst/FindNext関数を使用してさまざまなファイルとディレクトリを読み取っています。
私が抱えている唯一の問題は、ファイルがシンボリックリンクであるかどうかがわからないことです。ファイル属性に定数やフラグがなく、シンボリックリンクをテストするための関数が見つかりません。
ここで説明するように、FindFirst/FindNext関数を使用してさまざまなファイルとディレクトリを読み取っています。
私が抱えている唯一の問題は、ファイルがシンボリックリンクであるかどうかがわからないことです。ファイル属性に定数やフラグがなく、シンボリックリンクをテストするための関数が見つかりません。
BaseUnixのfpstatを使用できます。
このようなもの
uses baseUnix;
var s: stat;
fpstat(filname, s);
if s.st_mode = S_IFLNK then
writeln('is link');
また、ファイルに関する他の多くの情報(時間、サイズなど)も提供されます。
これはポータブルソリューションであるため、findfirstを使用するという当初のアイデアが最適です(最近ではWindowsにもシンボリックリンクがあります)。適応する唯一のことは、findfirstに渡す属性でシンボリックリンクチェックを要求することです。
uses sysutils;
var info : TSearchrec;
begin
// the or fasymlink in the next file is necessary so that findfirst
// uses (fp)lstat instead of (fp)stat
If FindFirst ('../*',faAnyFile or fasymlink ,Info)=0 then
begin
Repeat
With Info do
begin
If (Attr and fasymlink) = fasymlink then
Writeln('found symlink: ', info.name)
else
writeln('not a symlink: ', info.name,' ',attr);
end;
Until FindNext(info)<>0;
end;
FindClose(Info);
end.
関数fpLStatは答えです:
var
fileStat: stat;
begin
if fpLStat('path/to/file', fileStat) = 0 then
begin
if fpS_ISLNK(fileStat.st_mode) then
Writeln ('File is a link');
if fpS_ISREG(fileStat.st_mode) then
Writeln ('File is a regular file');
if fpS_ISDIR(fileStat.st_mode) then
Writeln ('File is a directory');
if fpS_ISCHR(fileStat.st_mode) then
Writeln ('File is a character device file');
if fpS_ISBLK(fileStat.st_mode) then
Writeln ('File is a block device file');
if fpS_ISFIFO(fileStat.st_mode) then
Writeln ('File is a named pipe (FIFO)');
if fpS_ISSOCK(fileStat.st_mode) then
Writeln ('File is a socket');
end;
end.
プリントアウト:
test_symlink
File is a link
test
File is a directory
fpstatを使用したヒントをありがとう。しかし、それは機能していないようです。ディレクトリとディレクトリへのシンボリックリンクの2つのファイルがあります。
drwxrwxr-x 2 marc marc 4096 Okt 1 09:40 test
lrwxrwxrwx 1 marc marc 11 Dez 5 13:49 test_symlink -> /home/marc/
これらのファイルにfpstatを使用すると、次のようになります。
Result of fstat on file test
Inode : 23855105
Mode : 16877
nlink : 92
uid : 1000
gid : 1000
rdev : 0
Size : 12288
Blksize : 4096
Blocks : 24
atime : 1354711751
mtime : 1354711747
ctime : 1354711747
Result of fstat on file test_symlink
Inode : 23855105
Mode : 16877
nlink : 92
uid : 1000
gid : 1000
rdev : 0
Size : 12288
Blksize : 4096
Blocks : 24
atime : 1354711751
mtime : 1354711747
ctime : 1354711747
属性st_modeに違いはありません。fpstatは、実際にはディレクトリであるリンク先の統計を取得すると思います...