Top > OOoBasic > Generic > Storage

*ストレージ [#d51f754f]
ストレージ。

#contents

**ストレージ構造 [#r2d04969]
ストレージはファイルシステムのように階層構造です。各階層は com.sun.star.embed.XStorage インターフェースなどをエクスポートしています。com.sun.star.container.XNameAccess インターフェースなどでその階層にあるファイル名など、要素名を取得できます。
**要素 [#q40a27a3]
ストレージに所属する要素は二種類に分かれます。ストレージとストリームです。ストレージはディレクトリに相当し、内部にほかのストレージやストリームを含みます。ストリームは普通のファイルに相当し、データを保持しています。

要素の種類の確認には .embed.XStorage インターフェースのメソッドが利用できます。isStorageElement メソッドで名前の要素がストレージかどうかを確認します。 また、isStreamElement メソッドでストリームかどうかを確認します。

**コミット [#f9dd152a]
ストレージの要素を変更した場合には変更を適用するために commit メソッドを呼ぶ必要があります。また、変更を無効にする場合には revert メソッドを呼びます。

.embed.XTransactedObject インターフェースをエクスポートしていても実装により動作しない場合があります。その場合にはコミットするまえに変更が直接反映されます。
**ドキュメントストレージ [#ne783aed]
ドキュメントストレージは .document.XStorageBasedDocument インターフェースの getDocumentStorage メソッドを利用して取得します。

#code(python){{
def document_storage_test():
	doc = XSCRIPTCONTEXT.getDocument()
	doc_storage = doc.getDocumentStorage()
}}

また、zip 圧縮した ODF ファイルからも作成できます (開いていないドキュメント)。

#code(python){{
def storage_test():
	ctx = XSCRIPTCONTEXT.getComponentContext()
	smgr = ctx.ServiceManager
	
	sf = smgr.createInstanceWithContext(
		u'com.sun.star.embed.StorageFactory', ctx)
	storage = sf.createInstanceWithArguments(
		(u'file:///home/user/Desktop/pkgp.odt',4))
}}
**ファイルシステムストレージ [#ib9f69dd]
ファイルシステムストレージはストレージとして OS のファイルシステム環境を利用します。ファイルシステムストレージは com.sun.star.embed.FileSystemStorageFactory サービスから作成します。

引数にはディレクトリの URL を指定します。モードの指定が必要であれば二番目に .embed.ElementModes の値を指定します。

#code(python){{
def filesystem_storage_test():
	ctx = XSCRIPTCONTEXT.getComponentContext()
	smgr = ctx.ServiceManager
	
	sf = smgr.createInstanceWithContext(
		u'com.sun.star.embed.FileSystemStorageFactory', ctx)
	storage = sf.createInstanceWithArguments(
		(u'file:///home/user/Desktop/py',1))
	
}}

**モード [#o9d39a43]
ストレージを開くときのモード。ファイルを開くときの読み/書きモード指定のようなもの。

|.embed.ElementModes|long||
|READ|1||
|SEEKABLE|2||
|SEEKABLEREAD|3||
|WRITE|4||
|READWRITE|7||
|TRUNCATE|8||
|NOCREATE|16||


**開く [#h8344992]
ストレージに含まれる要素を開きます。開いてサブストレージやデータを取得することが出来ます。

***ストレージ [#qaf7c590]
ストレージに含まれるサブストレージを開きます。openStorageElement メソッドにストレージ名およびモードを指定します。

#code(python){{
def open_storage_test():
	ctx = XSCRIPTCONTEXT.getComponentContext()
	smgr = ctx.ServiceManager
	
	sf = smgr.createInstanceWithContext(
		u'com.sun.star.embed.StorageFactory', ctx)
	
	storage = sf.createInstanceWithArguments(
		(u'file:///home/user/Desktop/smile.odg',4))
	
	
	thumb_dir_name = u'Thumbnails'
	thumb_file_name = u'thumbnail.png'
	in_stream = None
	try:
		if storage.hasByName(thumb_dir_name) and \
				storage.isStorageElement(thumb_dir_name):
			storage_thumbnails = storage.openStorageElement(thumb_dir_name, 1)
			
			
			stream = storage_thumbnails.openStreamElement(thumb_file_name, 1)
			in_stream = stream.getInputStream()
			
	except Exception,e:
		print e
	if in_stream:
		sfa = smgr.createInstanceWithContext(
			u'com.sun.star.ucb.SimpleFileAccess', ctx)
		sfa.writeFile(u'file:///home/user/Desktop/thumb.png', in_stream)
}}

odg ファイルに含まれているサムネイル画像を取得してローカルファイルに保存します。ストレージ要素を取得すると .embed.Storage サービスのインスタンスが戻ります。ストリーム要素は .io.XStream インターフェースとして取得できます。
***ストリーム [#u9eca40d]
ストレージに含まれるストリーム (ファイル) を開きます。上記ストレージの openStreamElement メソッドでストリームを開いて .io.XStream インターフェースを取得しています。

または、読み込み専用で開くのであれば cloneStreamElement メソッドにストリームの要素名を指定します。
 stream = storage.cloneStreamElement(u'element_name')
 stream_input = stream.getInputStream()
**コピー [#k03e5d8a]
ファイルコピー。
***ストレージからストレージへ [#v486e149]
あるストレージから別のストレージへファイルをコピーします。

copyElementTo メソッドの引数は、コピーする要素名、コピー先ストレージ、コピー先での要素名の順です。

#code(python){{
def storage_test():
	ctx = XSCRIPTCONTEXT.getComponentContext()
	smgr = ctx.ServiceManager
	
	sf = smgr.createInstanceWithContext(
		u'com.sun.star.embed.StorageFactory', ctx)
	
	storage = sf.createInstanceWithArguments(
		(u'file:///home/user/Desktop/smile.odg',4))
	
	
	sf = smgr.createInstanceWithContext(
		u'com.sun.star.embed.FileSystemStorageFactory', ctx)
	filesystem_storage = sf.createInstanceWithArguments(
		(u'file:///home/user/Desktop/py',1))
	
	try:
		filesystem_storage.copyElementTo(u'filters.py', storage, u'Scripts/python/filters.py')
		storage.commit()
	except Exception,e:
		print e
}}
上記のようにすると表示が変になったりします。各ストレージを段階的に取得してから行うべきです。
**名前の変更 [#l5bfde6f]
renameElement メソッドでストレージ中の要素名を変更できます。引数は順に元ファイル名、変更後ファイル名です。
#code(python){{
def rename_storage_test():
	ctx = XSCRIPTCONTEXT.getComponentContext()
	smgr = ctx.ServiceManager
	
	sf = smgr.createInstanceWithContext(
		u'com.sun.star.embed.FileSystemStorageFactory', ctx)
	filesystem_storage = sf.createInstanceWithArguments(
		(u'file:///home/user/Desktop/py',1))
	try:
		filesystem_storage.renameElement(u'file_', u'file.py')
	except Exception,e:
		print e
}}
システムファイルストレージでは commit する前に名前の変更が行われます。

**削除 [#kcc4fdb1]
ストレージに含まれる要素を削除します。removeElement メソッドの引数に削除したい要素名を指定します。同じ階層にある要素しか削除できません。

#code(python){{
def remove_storage_test():
	ctx = XSCRIPTCONTEXT.getComponentContext()
	smgr = ctx.ServiceManager
	
	sf = smgr.createInstanceWithContext(
		u'com.sun.star.embed.FileSystemStorageFactory', ctx)
	filesystem_storage = sf.createInstanceWithArguments(
		(u'file:///home/asuka/Desktop/py',1))
	try:
		filesystem_storage.removeElement(u'file.py')
		#filesystem_storage.commit()
	except Exception,e:
		print e
}}

**例 [#ea4d9575]
一例。
***ドキュメントに含まれる画像を取り出す [#r6a1e836]
ドキュメントに埋め込まれた形式で挿入された画像 (リンクではないもの) をストレージから取り出してローカルファイルに保存します。

埋め込まれた画像は Pictures サブストレージ中にあります。

#code(python){{
def document_storage_test():
	dir_url = u'file:///home/user/Desktop/py/'
	ctx = XSCRIPTCONTEXT.getComponentContext()
	smgr = ctx.ServiceManager
	doc = XSCRIPTCONTEXT.getDocument()
	
	doc_storage = doc.getDocumentStorage()
	
	pictures = u'Pictures'
	if doc_storage.hasByName(pictures):
		pictures_storage = doc_storage.openStorageElement(pictures, 1)
		names = pictures_storage.getElementNames()
		
		sfa = smgr.createInstanceWithContext(
			u'com.sun.star.ucb.SimpleFileAccess', ctx)
			
		for name in names:
			if pictures_storage.isStreamElement(name):
				stream = pictures_storage.openStreamElement(name, 1)
				sfa.writeFile(u''.join((dir_url, name)), stream.getInputStream())
}}

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes