[解決] SimpleFileAccess の openFileWrite はRewriteモード?

スプレッドシート (Calc) について
返信する
K.Tsunoda
記事: 71
登録日時: 11月 2, 2008, 6:44 pm
連絡する:

[解決] SimpleFileAccess の openFileWrite はRewriteモード?

投稿記事 by K.Tsunoda »

こんにちは。
「エラー表示」を質問中ですが、別件で質問です。

SimpleFileAccess なんですが、openFileWrite でオープンして TextOutputStream を使いました。

既存ファイルに対して、その既存ファイルデータサイズより小さいデータサイズを出力すると、
出力データサイズ部分までが上書き更新され、それ以降の後半が元のデータ内容のままで
残ります。Rewrite モードのようです。

他に OpenFileReadWrite があるので、openFileWrite は以前の内容を消して出力内容のみで
書き込まれる Output モードだと思ったのですが、違うのでしょうか?

コード: 全て選択

Sub Main
Dim oFileAcc As Object
Dim oOutputStream As Object
Dim i As Long
Const sURL As String = "D:\MyDocuments_D\TEMP\TEST1.txt"

  oFileAcc = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
  oOutputStream = CreateUnoService("com.sun.star.io.TextOutputStream")

  With oOutputStream
    .setOutputStream(oFileAcc.openFileWrite(ConvertToURL(sUrl)))
    For i = 1 to 20
      oOutputStream.writeString("TestData" & i & chr(13) & chr(10))
    Next i
    .closeOutput()
  End With
  
  ' 小さめのデータ量で再書き込み
  With oOutputStream
    .setOutputStream(oFileAcc.openFileWrite(ConvertToURL(sUrl)))
    For i = 1 to 10
      oOutputStream.writeString("TestDataXXXX" & i & chr(13) & chr(10))
    Next i
    .closeOutput()
  End With
End Sub
とりあえず、今は「Open Output / Print 」のベーシックな方法で処理しましたが、
TextOutputStream で Output モードの使用は出来ないのでしょうか?
最後に編集したユーザー K.Tsunoda [ 6月 15, 2009, 3:15 pm ], 累計 1 回
tani
記事: 60
登録日時: 6月 13, 2008, 10:12 am

Re: SimpleFileAccess の openFileWrite はRewriteモード?

投稿記事 by tani »

他に OpenFileReadWrite があるので、openFileWrite は以前の内容を消して出力内容のみで
書き込まれる Output モードだと思ったのですが、違うのでしょうか?
違うみたいですね。
apiリファレンスとかみても、単純に「読み取り専用モード」、「書き込み専用モード」、「読み書き両方モード」
をわけているだけのように思います。(メソッド名の語感からもそう捉えるのが自然なんじゃないかなと思います。)
とりあえず、今は「Open Output / Print 」のベーシックな方法で処理しましたが、
TextOutputStream で Output モードの使用は出来ないのでしょうか?
これで正しいように思います。
「以前の内容を消して出力内容のみで書き込まれる」とか「以前の内容の末尾に追記する」っていうのは
ある意味乱暴な処理(UNIX系なら標準出力からリダイレクトコマンドとか)なので、あえてTextOutputStream
にそのような機能をつける必要性はないんじゃないかなと想像しています。
K.Tsunoda
記事: 71
登録日時: 11月 2, 2008, 6:44 pm
連絡する:

Re: SimpleFileAccess の openFileWrite はRewriteモード?

投稿記事 by K.Tsunoda »

こんにちは。

CR+LF をデータとして書き込んでやる必要があるので、データ量が以前より小さい時は、
もしかしたら、EOF(0x1A)も書き込むのかなと思って、chr(26) を追加して試しましたが
だめですね(笑)

「Open Output / Print 」で支障ないので、それにしておきます。

もう1~2日、追加情報お待ちして解決にします。
K.Tsunoda
記事: 71
登録日時: 11月 2, 2008, 6:44 pm
連絡する:

Re: SimpleFileAccess の openFileWrite はRewriteモード?

投稿記事 by K.Tsunoda »

追加情報は無いようですので、これにて「解決」にします。

INI ファイルの入出力を簡便に行なう関数を VBA から OOo.Basic へ移植する作業中に
この問題にぶつかりましたが無事に移植完了しました。

以下にて公開しています。興味のある方、ご自由にお使いください。
http://blog.livedoor.jp/addinbox/archives/51216559.html

( 6/16 )
CR/LF含みの値も受け渡し可能に改良を加えました。
「コメント」といったデータにはCR/LFが有り得ますので、その場合に便利かと・・・
返信する

“Calc”に戻る