1

ここで説明するように、FindFirst/FindNext関数を使用してさまざまなファイルとディレクトリを読み取っています。

私が抱えている唯一の問題は、ファイルがシンボリックリンクであるかどうかがわからないことです。ファイル属性に定数やフラグがなく、シンボリックリンクをテストするための関数が見つかりません。

4

4 に答える 4

2

BaseUnixのfpstatを使用できます。

このようなもの

uses baseUnix;
var s: stat;
fpstat(filname, s);
if s.st_mode = S_IFLNK then
  writeln('is link');

また、ファイルに関する他の多くの情報(時間、サイズなど)も提供されます。

于 2012-12-05T12:20:17.380 に答える
2

これはポータブルソリューションであるため、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.
于 2012-12-06T10:33:56.930 に答える
1

関数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
于 2012-12-05T14:12:53.233 に答える
0

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は、実際にはディレクトリであるリンク先の統計を取得すると思います...

于 2012-12-05T13:57:33.533 に答える