2013年9月15日日曜日

TFileStream の 438 の謎


Lazarus,FPC の

(from FileUtil streams.inc)

constructor TFileStream.Create(const AFileName: string; Mode: Word);

begin
  Create(AFileName,Mode,438);
end;  

438 というのが、あります。

https://github.com/graemeg/freepascal/blob/master/rtl/solaris/ostypes.inc


 S_IRUSR = $100;           { Read permission for owner   }
 S_IWUSR = $080;           { Write permission for owner  }
 S_IXUSR = $040;           { Exec  permission for owner  }
 S_IRGRP = $020;           { Read permission for group   }
 S_IWGRP = $010;           { Write permission for group  }
 S_IXGRP = $008;           { Exec permission for group   }
 S_IROTH = $004;           { Read permission for world   }
 S_IWOTH = $002;           { Write permission for world  }
 S_IXOTH = $001;           { Exec permission for world   }  

ググっても出てこないので一応計算してみると

S_IRUSR  or S_IWUSR or S_IRGRP or
S_IWGRP or S_IROTH  or S_IWOTH = 438 でした。

それだけ。

すっきり。

Windows の場合 0 でも良さそうです。

TFileStream - THandleObject - TStream - TObject

ちなみに、このconstructor TFileStream.Create は、2つあり、どちらの Create も inherited されていません。
何故なのでしょう。

Create は THandleStream で初めて実装されています。
派生元の THandleStream は Handle の設定しかしていません。
こちらは inherited されているようですが・・・。

THandleStream の FHandle がスコープにあるので、アクセスできます。
それで一応、FHandleに値は設定もされているし動作も影響無さそうです。
var
 h: THandle;
inheritec Create( h)

とするか

FHandle:= h;

とするかの違いしかありません。

destructor も inherited されていませんが、TFileStream で初めて実装されます。

こちらも全く問題無さそうです。

一瞬放置されたコードなのかと思ってしまいました。

Delphi も一応確認したら似たような感じでした。





PS
Delphi の定義と異なるらしい。(上記の定義はFPCのもの。)詳細不明。(最新のは持ってないので)

0 件のコメント:

コメントを投稿