Top > OOoBasic > Generic > Storage

ストレージ Edit

ストレージ。

ストレージ構造 Edit

ストレージはファイルシステムのように階層構造です。各階層は com.sun.star.embed.XStorage インターフェースなどをエクスポートしています。com.sun.star.container.XNameAccess インターフェースなどでその階層にあるファイル名など、要素名を取得できます。

要素 Edit

ストレージに所属する要素は二種類に分かれます。ストレージとストリームです。ストレージはディレクトリに相当し、内部にほかのストレージやストリームを含みます。ストリームは普通のファイルに相当し、データを保持しています。

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

コミット Edit

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

.embed.XTransactedObject インターフェースをエクスポートしていても実装により動作しない場合があります。その場合にはコミットするまえに変更が直接反映されます。

ドキュメントストレージ Edit

ドキュメントストレージは .document.XStorageBasedDocument インターフェースの getDocumentStorage メソッドを利用して取得します。

  0
  1
  2
def document_storage_test():
    doc = XSCRIPTCONTEXT.getDocument()
    doc_storage = doc.getDocumentStorage()

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

  0
  1
  2
  3
  4
  5
  6
  7
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))

ファイルシステムストレージ Edit

ファイルシステムストレージはストレージとして OS のファイルシステム環境を利用します。ファイルシステムストレージは com.sun.star.embed.FileSystemStorageFactory サービスから作成します。

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

  0
  1
  2
  3
  4
  5
  6
  7
  8
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))
   

モード Edit

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

.embed.ElementModeslong
READ1
SEEKABLE2
SEEKABLEREAD3
WRITE4
READWRITE7
TRUNCATE8
NOCREATE16

開く Edit

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

ストレージ Edit

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

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
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 インターフェースとして取得できます。

ストリーム Edit

ストレージに含まれるストリーム (ファイル) を開きます。上記ストレージの openStreamElement メソッドでストリームを開いて .io.XStream インターフェースを取得しています。

または、読み込み専用で開くのであれば cloneStreamElement メソッドにストリームの要素名を指定します。

stream = storage.cloneStreamElement(u'element_name')
stream_input = stream.getInputStream()

コピー Edit

ファイルコピー。

ストレージからストレージへ Edit

あるストレージから別のストレージへファイルをコピーします。

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

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
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

上記のようにすると表示が変になったりします。各ストレージを段階的に取得してから行うべきです。

名前の変更 Edit

renameElement メソッドでストレージ中の要素名を変更できます。引数は順に元ファイル名、変更後ファイル名です。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
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 する前に名前の変更が行われます。

削除 Edit

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

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
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

Edit

一例。

ドキュメントに含まれる画像を取り出す Edit

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

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

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
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