フォルダ/ファイルの情報を扱う

 DirectoryInfo/FileInfoを使って、フォルダやファイルの情報の使い方を見ていきましょう。

 タイムスタンプを取得、設定する

 System.IOのDirectoryInfo/FileInfoのCreationTime、LastWriteTime、LastAccessTimeプロパティを使います。それぞれ作成時間、更新時間、最終アクセス時間を示します。
 まず取得するスクリプトを組んでみます。

import System
from System.IO import DirectoryInfo, FileInfo

di = DirectoryInfo("C:\\test")
print "フォルダ(\""+ di.FullName + "\")の作成時間:", di.CreationTime
print "フォルダ(\""+ di.FullName + "\")の更新時間:", di.LastWriteTime
print "フォルダ(\""+ di.FullName + "\")の最終アクセス時間:", di.LastAccessTime

print

fi = FileInfo("c:\\test\\test.txt")
print "ファイル(\""+ fi.FullName + "\")の作成時間:", fi.CreationTime
print "ファイル(\""+ fi.FullName + "\")の更新時間:", fi.LastWriteTime
print "ファイル(\""+ fi.FullName + "\")の最終アクセス時間:", fi.LastAccessTime

raw_input()

出力画面
 フォルダ("C:\test")の作成時間: 2011/03/20 23:44:27
 フォルダ("C:\test")の更新時間: 2011/03/20 23:44:56
 フォルダ("C:\test")の最終アクセス時間: 2011/03/26 13:02:43

 ファイル("c:\test\test.txt")の作成時間: 2011/03/20 23:44:35
 ファイル("c:\test\test.txt")の更新時間: 2011/03/20 23:45:00
 ファイル("c:\test\test.txt")の最終アクセス時間: 2011/03/26 13:13:51

 では次に設定してから確認するスクリプトを作ってみます。

import System
from System import DateTime
from System.IO import DirectoryInfo, FileInfo

di = DirectoryInfo("C:\\test")
di.CreationTime = DateTime.Now
di.LastWriteTime = DateTime.Now
di.LastAccessTime = DateTime.Now

print "フォルダ(\""+ di.FullName + "\")の作成時間:", di.CreationTime
print "フォルダ(\""+ di.FullName + "\")の更新時間:", di.LastWriteTime
print "フォルダ(\""+ di.FullName + "\")の最終アクセス時間:", di.LastAccessTime

print

fi = FileInfo("c:\\test\\test.txt")
fi.CreationTime = DateTime.Now
fi.LastWriteTime = DateTime.Now
fi.LastAccessTime = DateTime.Now

print "ファイル(\""+ fi.FullName + "\")の作成時間:", fi.CreationTime
print "ファイル(\""+ fi.FullName + "\")の更新時間:", fi.LastWriteTime
print "ファイル(\""+ fi.FullName + "\")の最終アクセス時間:", fi.LastAccessTime

raw_input()

出力画面:
 フォルダ("C:\test")の作成時間: 2011/03/26 13:33:32
 フォルダ("C:\test")の更新時間: 2011/03/26 13:33:32
 フォルダ("C:\test")の最終アクセス時間: 2011/03/26 13:33:32

 ファイル("c:\test\test.txt")の作成時間: 2011/03/26 13:33:32
 ファイル("c:\test\test.txt")の更新時間: 2011/03/26 13:33:32
 ファイル("c:\test\test.txt")の最終アクセス時間: 2011/03/26 13:33:32
タイムスタンプが変更されましたね。

 属性を取得、設定する

ここでは属性を扱うのに、DirectoryInfo/FileInfoクラスのAttributesプロパティを使ってみます。

AttributesプロパティはFileAttributes列挙体と呼ばれるものです。列挙体とはIron Pythonで扱える変数としては整数と同じなんですが、通常2進数整数として扱い、各ビットに意味をもたせて各スイッチのON/OFFを表現します。

FileAttributes列挙体のメンバと意味は次のようなものです。
ReadOnly ファイルは読み込み専用です。
Hidden ファイルは隠しファイルです。したがって通常のディレクトリ リストには表示されません。
System システム ファイルです。 このファイルはオペレーティング システムの一部です。またはオペレーティング システムが排他的に使用します。
Directory ファイルはディレクトリです。
Archive ファイルのアーカイブ状態。 アプリケーションは、ファイルにバックアップまたは削除のマークを付けるために、この属性を使います。
Device 今後使用するために予約されています。
Normal 標準のファイルであり、他の属性セットは持ちません。 この属性は単独で使用した場合だけ有効です。
Temporary 一時ファイルです。 ファイル システムは、アクセス速度を上げるために、データをフラッシュして大容量ストレージに返すのではなく、すべてのデータをメモリに保持しようとします。 一時ファイルが不要になったときは、すぐにアプリケーションで削除します。
SparseFile スパース ファイルです。 スパース ファイルは、通常、データの大部分が 0 である大きなファイルです。
ReparsePoint ファイルには、ファイルまたはディレクトリに関連付けられたユーザー定義のデータ ブロックである、リパース ポイントが含まれています。
Compressed ファイルは圧縮ファイルです。
Offline ファイルはオフラインです。 オフラインのファイルのデータは、即時には使用できません。
NotContentIndexed ファイルには、オペレーティング システムの内容インデックス付けサービスによるインデックスは付いていません。
Encrypted ファイルまたはディレクトリは暗号化されています。 ファイルの場合は、ファイルのすべてのデータが暗号化されています。 ディレクトリの場合は、新規作成されるファイルおよびディレクトリが既定で暗号化されます。

 このFileAttributes列挙体のビット演算を行うことで、フォルダ/ファイルの属性を取得したり、設定することが可能になります。
例を見てみましょう。

import System
from System.IO import DirectoryInfo, FileInfo, FileAttributes

att = FileAttributes

di = DirectoryInfo("C:\\test")
fi = FileInfo("c:\\test\\test.txt")
if not (di.Exists and fi.Exists):
  exit()

list1 = (di,fi)

for target in list1:
#ディレクトリ属性か調べる
if(target.Attributes & att.Directory):
  print target.Name + "はフォルダです。"
  #読み取り専用属性か調べる
  if(target.Attributes & att.ReadOnly):
    print target.Name + "は書き込み禁止フォルダです。"
  else:
    print target.Name + "は書き込みを許可されているフォルダです。"
else:
  print target.Name + "はフォルダじゃないです。"
  if(target.Attributes & att.Hidden):
    #隠しファイル属性を解除する
    target.Attributes &= ~att.Hidden
    print target.Name + "の隠しファイル属性を解除しました。"
  else:
    #隠しファイル属性を設定する
    target.Attributes |= att.Hidden
    print target.Name + "を隠しファイルに設定しました。"

raw_input()

出力画面:
 testはフォルダです。
 testは書き込みを許可されているフォルダです。
 test.txtはフォルダじゃないです。
 test.txtを隠しファイルに設定しました。
ここで注意が一つだけあります。上記スクリプトの中に以下の記述が書かれています。

if not (di.Exists and fi.Exists):
  exit()

これは、仮にdi、fi、が存在しなくてもdi.Attributesやfi.Attributesは-1という値を持ちます。
msdnには『FileNotFoundException』というエラーを出すと書かれていますが、実際は出ません。そのためエラー回避として"di"や"fi"が存在していることを確認しています。

 ファイルサイズを取得する

  ファイルサイズを取得するにはFileInfoクラスのLengthプロパティを使います。値は、バイト単位の整数となります。やってみましょう。

import System
from System.IO import FileInfo

fi = FileInfo("c:\\test\\test.txt")
print fi.Name + "のファイルサイズは"+str(fi.Length)+"バイトです。"

raw_input()

出力画面:
 test.txtのファイルサイズは10バイトです。
 フィルダサイズの取得は、別で説明します。