1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

jcifsでlastModifiedやcreateTimeを取ろうとすると0が返ってくる

Last updated at Posted at 2015-09-01

概要

Javaからjcifsというライブラリを使ってWindows共有ファイルにアクセスしたとき、最終更新時間や作成時間の情報がうまく取れなかった問題に関するメモ。

バージョン情報

pom.xml
<dependency>
	<groupId>jcifs</groupId>
	<artifactId>jcifs</artifactId>
	<version>1.3.17</version>
</dependency>

現象

jcifs.smb.SmbFile#lastModifiedjcifs.smb.SmbFile#createTime0を返す場合がある. 正しい値を返す場合もある.

解決方法

jcifs.smb.SmbFileのコンストラクタを呼び出す前に,

java
jcifs.Config.setProperty("jcifs.smb.client.attrExpirationPeriod", "0");

をどこかで呼び出す(jcifs.Configはjcifsのstaticな設定です).

詳細

lastModified()および, このメソッドが呼び出しているexists()のソースを追うと原因が分かります.

  1. lastModified()exists()を呼び出したあと, フィールドlastModifiedの値を返しています.
  2. exists()の中にはフィールドlastModifiedを更新する処理がありますが, フィールドattrExpirationの値がSystem.currentTimeMillis()の返り値よりも大きい場合はこの処理をスキップします.
  3. lastModifiedはインスタンス生成時に(コンストラクタによっては)初期値が0にセットされています.
  4. attrExpirationはインスタンス生成時にSystem.currentTimeMillis() + attrExpirationPeriodの値がセットされています.
  5. フィールドattrExpirationPeriodの値はDEFAULT_ATTR_EXPIRATION_PERIODによってデフォルト値5000が設定されています.

つまりは更新時間情報のキャッシュ処理が原因! SmbFileはインスタンス生成されてから5000ミリ秒経つまではlastModified()0を返し続けます. attrExpirationPeriodをデフォルト値5000を参照させず0を指定してあげればよいので, jcifs.Config"jcifs.smb.client.attrExpirationPeriod"0を設定すると, この問題は解決します.

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?