2016年11月3日木曜日

アトリビュートの設定

みなさん。 こんばんは。

今日はファイルのアトリビュートをまとめて設定してみましょう。

設定を行うインターフェース群は、すべて java.nio.file.attribute.AttributeView インターフェースの

継承関係にあります。

ファイルやディレクトリに対するアトリビュートを設定するために使用されるのがFileAttributeView

インターフェースです。

しかし、FileAttributeViewインターフェースにはメソッドが定義されていません。

実際には、用途ごとに定義されているFileAttributeViewインターフェースのサブインターフェースを

使用します。

BasicFileAttributeViewインターフェースはOSに依存しない共通のアトリビュートを設定するための

インターフェースです。

アトリビュートの取得に使用したBasicFileAttributesインターフェースに対応しており、

BasicFileAttributesインターフェースで取得できるアトリビュートを設定することができます。

そして、OSに依存したアトリビュートの設定を行うには、Windows用のDosFileAttributeView

インターフェース、POSIXに準拠したOS用のPosixFileAttributeViewインターフェースを使用します。

それぞれDosFileAttributesインターフェース、PosixFileAttributesインターフェースに対応してます。

PosixFileAttributeViewインターフェースはBasicFileAttributeViewインターフェースだけでなく、

FileOwnerAttributeViewインターフェースも継承しています。

FileOwnerAttributeViewインターフェースはオーナを設定するためのインターフェースです。

FileOwnerAttributeViewインターフェースのサブインターフェースはもう1つ、

AclFileAttributeViewインターフェースが提供されています。

インターフェース名のACLはAccess Control List (アクセス制御リスト)の略称です。

NIO.2のACLはRFC 3350: Network File System(NFS) version4 Protocol に基づいています。

これらのインターフェースのオブジェクトを取得するには、FilesクラスのgetFileAttributeView

メソッドを使用します。

getFileAttributeViewメソッドは、第1引数の型がPathインターフェース、

第2引数の型がClassクラス、第3引数は可変長引数でLinkOption列挙型になります。

取得したいインターフェースを第2引数に指定することで、オブジェクトを取得できます。

今回はDosFileAttributeViewインターフェースとPosixFileAttributeViewインターフェースの

オブジェクトを取得して、アトリビュートを設定してみます。

BasicFileAttributeViewインターフェースは最終更新日時、最終アクセス日、作成日時を設定する

setTimeメソッドを定義しています。

同様に、DosFileAttributeViewインターフェースはファイルをリードオンリーに設定する

setReadOnlyメソッド、隠しファイルに設定するsetHiddenメソッド、アーカイブファイルに設定する

setArchiveメソッド、そしてシステムファイルに設定するsetSystemメソッドなどを定義しています。

PosixFileAttributeViewインターフェースはパーミッションを設定するsetPermissionsメソッドと

グループを設定するsetGroupメソッドを定義しています。

また、PosixFileAttributeViewインターフェースのスーパーインターフェースである

FileOwnerAttributeViewインターフェースではオーナを設定するsetOwnerメソッドを定義してます。

では、まずWindowsで複数のアトリビュートをまとめて設定してみましょう。

// 対象となるパスPath path = Paths.get("var.txt");
// Windows用のDosFileAttributeViewオブジェクトを取得DosFileAttributeView view = Files.getFileAttributeView(path, DosFileAttributeView.class);
// BasicFileAttributeViewインターフェースで定義されたメソッドlong now = System.currentTimeMillis();view.setTime(FileTime.fromMillis(now), // 最終更新日時                   FileTime.fromMillis(now), // 最終アクセス日時                   FileTime.fromMillis(now)); // 作成日時
// DosFileAttributeViewインターフェースで定義されたメソッド// システムファイルとして設定するview.setSystem(true);

setTimeメソッドは、第1引数が最終更新日時、第2引数が最終アクセス日時、第3引数が

作成日時になります。これらの値を設定しない場合は、引数にnullを指定します。

そして、trueを引数にしてsetSystemメソッドをコールすることで、

ファイルをしsてむファイルとして設定しています。

同様に、PosixFileAttributeViewインターフェースを使用して、アトリビュートを設定してみます。

// 対象となるバスPath path = Paths.get("var.txt");
// POSIX準拠OS用のPosixFileAttributeViewオブジェクトを取得PosixFileAttributeView view  = Files.getFileAttributeView(path, PosixFileAttributeView.class);
// BasicFileAttributeViewインターフェースで定義されたメソッドlong now = System.currentTimeMillis();view.setTimes(FileTime.fromMillis(now), // 最終更新日時                    FileTime.fromMillis(now); // 最終アクセス日時                    FileTime.fromMillis(now)); // 作成日時
// アカウントの情報を取得UserPrincipalLookupService lookupService = FileSystems.getDefault().getUserPrincipalLookupService();UserPrincipal owner = LookupService.loolupPrincipalByName("sakuraba");
// PosixFileAttributeViewインターフェースで定義されたメソッドview.setOwner(owner);

PosixFileAttributeViewインターフェースでは、オーナやグループを設定することができます。

オーナはUserPrincipalインターフェース、グループはGroupPrincipalインターフェースで表します。

いずれもUserPrincipalLookupServiceクラスを使用し、既存アカウントやグループから検索します。

UserPrincipalLookupServiceオブジェクトを取得するためには、

FileSystemクラスのgetUserPrincipalLookupServiceメソッドを使用します。

そして、UserPrincipalオブジェクトを検索するにはlookupPrincipalByNameメソッドを使用します。

引数は文字列でアカウント名を指定します。

GroupPricipalオブジェクトを検索するにはlookupPrincipalByGroupNameを使用します。

引数はグループ名です。

そして、得られたUserPrincipalオブジェクトをsetOwnerメソッドで指定します。

このようにAttributeViewインターフェースのサブインターフェース群を使用することで、

アトリビュートをまとめて設定することが可能です。

それでは今日はこの辺にしておきましょう。

それではまた!
人気ブログランキングへ

0 件のコメント:

コメントを投稿