フォルダ/ファイルの情報を扱う
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"が存在していることを確認しています。