![]() ![]() ![]()
|
BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0 |


ファイルの作成や読み書き、属性などの情報の取得、テンポラリ ファイルの作成を行います。
例 729. ファイルを読み込む方法
SFCError error; // エラー値 SFXFile file; // ファイル クラス ( のインスタンス ) SFXAnsiStringStreamReader reader; // ファイル読み込み用ストリーム SFXAnsiString stringFromFile; // この変数にデータが読み込まれる SFXAnsiString tempString; // 読み込みモードでファイルを開く if ((error = file.OpenReadOnly(SFXPath("/dir1/data.txt"))) == SFERR_NO_ERROR) { // ファイル読み込み用ストリームを取得する ( 1024 はバッファサイズ ) if ((error = file.GetStreamReader(1024, &reader)) == SFERR_NO_ERROR) { while (!reader.Ends()) { // ファイル読み込み用ストリームの終端に到達するまで繰り返す // フェッチする ( データを読み込む ) // バッファサイズを指定しているので、1024 バイトしか読み込まれない if ((error = reader.Fetch()) != SFERR_NO_ERROR) { // エラーのとき break; } // tempString にデータを読み込む if ((error = reader.ReadSFXAnsiString(&tempString)) != SFERR_NO_ERROR) { // エラーのとき break; } // stringFromFile の末尾に tempString を加える stringFromFile += tempString; } reader.Release(); } file.Close(); }
例 730. ファイルの書き込み
SFCError error; // エラー値 SFXFile file; // ファイル クラス ( のインスタンス ) SFXAnsiStringStreamWriter writer; // ファイル書き込み用ストリーム SFXAnsiString string("abcdefghijklmnopqrstuvwxyz"); // 書き込むデータ ACharConstPtr p = string.GetBuffer(); // 文字列を指すポインター ACharConstPtr endOfString = p + string.GetLength(); // 文字列の末尾 SInt32 bufferSize = 1024; // 読み書きモードでファイルを開く if ((error = file.OpenReadWrite(SFXPath("/dir1/data.txt"))) == SFERR_NO_ERROR) { // ファイル書き込み用ストリームを取得する if ((error = file.GetStreamWriter(bufferSize, &writer)) == SFERR_NO_ERROR) { for (; p < endOfString; p += bufferSize) { // 書き込むサイズ SInt32 size = (endOfString - p < bufferSize) ? endOfString - p : bufferSize; // 文字列を書き込む if ((error = writer.Write(p, size)) != SFERR_NO_ERROR) { break; // エラー } // フラッシュする ( 実際にファイルにデータを書き込む ) if ((error = writer.Flush()) != SFERR_NO_ERROR) { // エラーのとき break; } } writer.Release(); } file.Close(); }
| コンストラクタ/デストラクタ |
|---|
|
SFXFile( Void ) SFXFile( SInt32 cache ) SFXFile クラスのコンストラクタです。
|
|
~SFXFile( Void ) Destructor of SFXFile class.
|
| パブリック関数 | |
|---|---|
| Void |
Cancel( Void ) 登録されているコールバックをキャンセルします。
|
| Void |
Close( Void ) ファイルをクローズします。
|
| static SFCError |
Create(
SFXPathConstRef path
, Bool force = false
) ファイルを作成します。
|
| static SFCError |
DeviceFreeSpace(
UInt32Ptr result
) デバイスの空き容量を取得します。
|
| static SFCError |
DeviceTotalSpace(
UInt32Ptr result
) デバイスの容量を取得します。
|
| static SFCError |
Exists(
SFXPathConstRef path
, BoolPtr result
) ファイルが存在するか調べます。
|
| SInt32 |
GetCacheSize( Void ) ファイル操作時のキャッシュ サイズを取得します。
|
| static SFCError |
GetCreateDate(
SFXPathConstRef path
, SFXDatePtr result
) ファイルの作成日時を取得します。
|
| SFBFileSmpConstRef |
GetSFBFile( Void ) 内部に保持しているファイル インターフェースを取得します。
|
| SFBFileMgrSmpConstRef |
GetSFBFileMgr( Void ) 内部に保持しているファイル マネージャ インターフェースを取得します。
|
| static SFCError |
GetSize(
SFXPathConstRef path
, UInt32Ptr result
) ファイル サイズを取得します。
|
| SFCError |
GetStreamReader(
UInt32 size
, SFXStreamReaderPtr result
) GetStreamReader( SFXStreamReaderPtr result ) ファイル読み込み用ストリームを取得します。
|
| SFCError |
GetStreamWriter(
UInt32 size
, SFXStreamWriterPtr result
) GetStreamWriter( SFXStreamWriterPtr result ) ファイル書き込み用ストリームを取得します。
|
| static SFCError |
GetTemporaryPath(
SFXPathConstRef path
, SFXPathPtr result
) テンポラリ ファイルのパスを取得します。
|
| static SFCError |
GetUniquePath(
SFXPathConstRef path
, SFXAnsiStringConstRef prefix
, SFXAnsiStringConstRef suffix
, SFXPathPtr result
) 既存のものと重複しない永続的なファイル パスを取得します。
|
| static SFCError |
IsReadOnly(
SFXPathConstRef path
, BoolPtr result
) ファイルが読み込み専用か判定します。
|
| static SFCError |
IsSystem(
SFXPathConstRef path
, BoolPtr result
) ファイルがシステム ファイルか判定します。
|
| SFCError |
OpenReadOnly(
SFXPathConstRef path
) ファイルを読み込みモードでオープンします。
|
| SFCError |
OpenReadWrite(
SFXPathConstRef path
, Bool force = false
) ファイルを読み書きモードでオープンします。
|
| SFCError |
Read(
VoidPtr buffer
, UInt32Ptr size
) 読み込み用ストリームを使わずにファイルからデータを読み込みます。
|
| static SFCError |
Remove(
SFXPathConstRef path
) ファイルを削除します。
|
| static SFCError |
Rename(
SFXPathConstRef from
, SFXPathConstRef to
) ファイルの移動 / ファイル名の変更を行います。
|
| SFCError |
ScheduleRead(
CallbackSPP spp
, VoidPtr reference
) 読み込み用ストリームを使わないファイルからのデータ読み込みをスケジュールします。
|
| SFCError |
ScheduleWrite(
CallbackSPP spp
, VoidPtr reference
) 【 現在、この関数は使えません。 】
|
| SFCError |
Seek(
SInt32 distance
) 現在の位置から指定した移動量だけファイル ポインターを移動します。
|
| SFCError |
SeekEnd(
SInt32 distance
) ファイルの末尾から指定した移動量だけファイル ポインターを移動します。
|
| SFCError |
SeekStart(
SInt32 distance
) ファイルの先頭からファイル ポインターを進めます。
|
| Void |
SetCacheSize(
SInt32 size
) ファイル操作時のキャッシュ サイズを設定します。
|
| UInt32 |
Tell( Void ) 現在のファイル ポインターの位置を取得します。
|
| SFCError |
Truncate(
UInt32 position
) 指定した位置でファイルを切り捨てます。
|
| SFCError |
Write(
VoidConstPtr buffer
, UInt32Ptr size
) 書き込み用ストリームを使わずにファイルにデータを書き込みます。
|
| 型 |
|---|
|
CallbackSPP
(SFXStorage から継承)
コールバック関数を表す型です。
|
[ public, explicit ] SFXFile(Void);
[ public, explicit ]
SFXFile(
SInt32 cache // ファイル操作時のキャッシュサイズ
);
[ public, virtual ] ~SFXFile(Void);
Close an opened file.
[ public, virtual ] Void Cancel(Void);
[ public ] Void Close(Void);
ファイルがオープンされているとき、コールバックをキャンセルしてファイルをクローズします。
SFXFile file;
...
file.Close(); // ファイルをクローズする
[ public, static ] SFCError Create( SFXPathConstRef path // 作成するファイルのパス Bool force = false // ディレクトリを再帰的に作成するかどうか );
引数 force を true にすると、指定したパスに存在しないディレクトリも作成します。
// ファイルを強制的に作成 // 親ディレクトリが存在しない場合は自動的に作成 SFXFile::Create(SFXPath("/dir1/data.txt"), true);
UInt32 space;
SFXFile::DeviceFreeSpace(&space); // space に空き容量を取得する
UInt32 space;
SFXFile::DeviceTotalSpace(&space); // space にデバイスの容量を取得する
[ public, static ] SFCError Exists( SFXPathConstRef path // 存在を調べるファイルのパス BoolPtr result // 結果を受け取るポインター );
Bool b; // Exists 関数の戻り値はエラー値 SFXFile::Exists(SFXPath("/dir1/data.txt"), &b); if (b) { // ファイルが存在するとき ... }
[ public, const ] SInt32 GetCacheSize(Void);
[ public, static ] SFCError GetCreateDate( SFXPathConstRef path // ファイルのパス SFXDatePtr result // 作成日時を受け取るポインター );
SFXDate date;
// ファイルの作成日時を取得する
SFXFile::GetCreateDate(SFXPath("/dir1/data.txt"), &date);
[ public, const ] SFBFileSmpConstRef GetSFBFile(Void);
内部に保持しているファイル インターフェース( SFBFile クラスのインスタンス )を取得します。
[ public, const ] SFBFileMgrSmpConstRef GetSFBFileMgr(Void);
内部に保持しているファイル マネージャ インターフェース( SFBFileMgr クラスのインスタンス )を取得します。
[ public, static ] SFCError GetSize( SFXPathConstRef path // ファイルのパス UInt32Ptr result // サイズを受け取るポインター );
UInt32 size;
// ファイル サイズを取得する
SFXFile::GetSize(SFXPath("/dir1/data.txt"), &size);
[ public, virtual ] SFCError GetStreamReader( UInt32 size // バッファサイズ SFXStreamReaderPtr result // ファイル読み込み用ストリームへのポインター );
[ public, virtual ] SFCError GetStreamReader( SFXStreamReaderPtr result // ファイル読み込み用ストリームへのポインター );
ファイル読み込み用ストリームのバッファ サイズを指定することも可能です。 ファイル読み込み用ストリームは、読み込むデータの種類に応じて SFXBinaryStreamReader、SFXAnsiStringStreamReader、または SFXWideStringStreamReader クラスを使い分けます。
SFXFile file; SFXAnsiStringStreamReader reader; SFXAnsiString temp; SFXAnsiString string; // 読み出した文字列を格納する SFXPath path("/data.txt"); // ファイル名 // ファイルをオープンする if (file.OpenReadOnly(path) == SFERR_NO_ERROR) { // ファイルのオープンに成功したとき // ファイル読み込み用ストリームを取得する file.GetStreamReader(1024, &reader); // ファイルの終端まで繰り返す while (!reader.Ends()) { if (reader.GetReadableSize() == 0) { // ファイルからファイル読み込み用ストリームへデータを読み込む reader.Fetch(); } // ファイル読み込み用ストリームから temp へデータを読み込む reader >> temp; string += temp; } file.Close(); // ファイルをクローズする }
SFXFile::GetStreamWriter | SFXBinaryStreamReader | SFXAnsiStringStreamReader | SFXWideStringStreamReader
[ public, virtual ] SFCError GetStreamWriter( UInt32 size // サイズ SFXStreamWriterPtr result // ファイル書き込み用ストリームへのポインター );
[ public, virtual ] SFCError GetStreamWriter( SFXStreamWriterPtr result // ファイル書き込み用ストリームへのポインター );
ファイル書き込み用ストリームのバッファ サイズを指定します。 ファイル書き込み用ストリームは、書き込むデータの種類に応じて SFXBinaryStreamWriter クラス、SFXAnsiStringStreamWriter クラス、SFXWideStringStreamWriter クラスを使い分けます。
SFXFile file;
SFXAnsiStringStreamWriter writer;
SFXAnsiString string("abcdefg"); // 書き込む文字列
SFXPath path("/data.txt"); // ファイル名
// ファイルをオープンする
if (file.OpenReadWrite(path) == SFERR_NO_ERROR) {
// ファイルオープンに成功したとき
// ファイル書き込み用ストリームを取得する
file.GetStreamWriter(string.GetLength(), &writer);
// string からファイル書き込み用ストリームへデータを書き込む
writer << string;
// ファイル書き込み用ストリームからファイルへデータを書き込む
writer.Flush();
file.Close(); // ファイルを閉じる
}
SFXFile::GetStreamReader | SFXBinaryStreamWriter | SFXAnsiStringStreamWriter | SFXWideStringStreamWriter
[ public, static ] SFCError GetTemporaryPath( SFXPathConstRef path // テンポラリ ファイルを作成するディレクトリのパス SFXPathPtr result // テンポラリ ファイルのパスを受け取るポインター );
SFXFile::GetTemporaryPath 関数は、一時的に作成するファイルのために、 既存のものと重複しない一時的なファイル パスを取得するときに使います。
![]() |
注意 |
|---|---|
| 一時的でない永続的なファイルのパスを取得する場合は、SFXFile::GetUniquePath 関数を使います。 | |
![]() |
注意 |
|---|---|
| SFXFile::GetTemporaryPath 関数は、内部的に接頭辞として "sfx"、接尾辞として "fle.tmp" をそれぞれ引数に指定して SFXFile::GetUniquePath 関数を呼び出しています。 | |
SFXPath dir("/");
SFXPath path;
if (SFXFile::GetTemporaryPath(path, &path) == SFERR_NO_ERROR) {
// "/sfx7182CBD4fle.tmp" のようなファイル パスが得られる
TRACE("%s", path.Get().GetCString());
}
[ public, static ] SFCError GetUniquePath( SFXPathConstRef path // ファイルを作成するディレクトリのパス SFXAnsiStringConstRef prefix // ファイル名のプレフィックス(接頭辞) SFXAnsiStringConstRef suffix // ファイル名のサフィックス(接尾辞) SFXPathPtr result // ファイルのパスを受け取るポインター );
ファイル名は乱数によって生成されるため、 既に多くのファイルが存在する場合、ファイル パスの取得に失敗する可能性があります。
![]() |
注意 |
|---|---|
| 乱数で発生させたファイル名がすでに存在する場合、64 回まで繰り返しこの操作をリトライします。 それでも既存のものと重複しないファイル パスを生成できない場合は失敗となります。 | |
![]() |
注意 |
|---|---|
| 一時的なテンポラリ ファイル ( すぐに削除するファイル ) の場合は、SFXFile::GetTemporaryPath 関数を使います。 | |
SFXPath dir("/");
SFXPath path;
if (SFXFile::GetUniquePath(dir, "sfx", ".dat", &path) == SFERR_NO_ERROR) {
// "/sfx7182CBD4.dat" のようなファイル パスが得られる
TRACE("%s", path.Get().GetCString());
}
[ public, static ] SFCError IsReadOnly( SFXPathConstRef path // 調べるファイルのパス BoolPtr result // 結果を受け取るポインター );
Bool b; // IsReadOnly 関数の戻り値はエラー値 SFXFile::IsReadOnly(SFXPath("/dir1/data.txt"), &b); if (b) { // ファイルが読み込み専用の場合 ... }
[ public, static ] SFCError IsSystem( SFXPathConstRef path // 調べるファイルのパス BoolPtr result // 結果を受け取るポインター );
[ public ] SFCError OpenReadOnly( SFXPathConstRef path // オープンするファイル パス );
SFXFile file; // ファイルを読み込みモードでオープンする if (file.OpenReadOnly(SFXPath("/dir1/data.txt")) == SFERR_NO_ERROR) { ... // ファイルをクローズする file.Close(); }
[ public ] SFCError OpenReadWrite( SFXPathConstRef path // オープンするファイルのパス Bool force = false // ファイルが存在しない場合は作成するかどうか );
SFXFile file; // ファイルを読み書きモードでオープンする if (file.OpenReadWrite(SFXPath("/dir1/data.txt")) == SFERR_NO_ERROR) { ... // ファイルをクローズする file.Close(); }
[ public, virtual ] SFCError Read( VoidPtr buffer // データを受け取るバッファのポインター UInt32Ptr size // 読み込むバイト数、読み込んだバイト数を受け取るポインター );
あるファイル ( src.txt ) を 別のファイル ( dst.txt ) にコピーします。
SFXFile fin; SFXFile fout; SFXBinaryStreamReader reader; SFXBinaryStreamWriter writer; SFXBuffer buffer; // 入力ファイルを読み込みモードでオープンする if (fin.OpenReadOnly(SFXPath("/src.txt")) == SFERR_NO_ERROR) { // 出力ファイルを読み書きモードでオープンする if (fout.OpenReadWrite(SFXPath("/dst.txt")) == SFERR_NO_ERROR) { fin.GetStreamReader(1024, &reader); // 読み込み用ストリームを取得する fout.GetStreamWriter(1024, &writer); // 書き込み用ストリームを取得する UInt08 c; // 入力ファイルの終端まで while (!reader.Ends()) { buffer.SetSize(reader.GetReadableSize()); reader.Fetch(); // ファイルから読み込み用ストリームへデータを読み込む reader.Read(&buffer); // 読み込み用ストリームから buffer へデータを読み込む writer.Write(buffer); // buffer から書き込み用ストリームへデータを書き込む writer.Flush(); // 書き込み用ストリームからファイルへデータを書き込む } fout.Close(); // 出力ファイルをクローズする } fin.Close(); // 入力ファイルをクローズする }
[ public, static ] SFCError Remove( SFXPathConstRef path // 削除するファイル パス );
if (SFXFile::Remove(SFXPath("/dir/data.txt")) == SFERR_NO_ERROR) {
...
}
[ public, static ] SFCError Rename( SFXPathConstRef from // 変更前のファイル パス SFXPathConstRef to // 変更後のファイル パス );
dir1 ディレクトリにある data.txt を dir2 に移動する
if (SFXFile::Rename(SFXPath("/dir1/data.txt"), SFXPath("/dir2/data.txt"))
== SFERR_NO_ERROR) {
...
}
dir1 ディレクトリにある data.txt を file.txt に変更する
if (SFXFile::Rename(SFXPath("/dir1/data.txt"), SFXPath("/dir1/file.txt"))
== SFERR_NO_ERROR) {
...
}
[ public, virtual ] SFCError ScheduleRead( CallbackSPP spp // コールバック関数のポインター VoidPtr reference // コールバック関数に渡すユーザーデータ );
SFXFile::ScheduleRead 関数は、SFXFile::Read 関数を使ってファイルからデータを読み込むコールバック関数を登録するために使います。
※ SFXFile::Read 関数の戻り値が AEE_STREAM_WOULDBLOCK である場合や、まだ読み込むデータが残っている場合、 SFXFile::ScheduleRead 関数でコールバック関数を登録して、再びファイルからのデータ読み込みを試みます。
class MyClass {
SFXFile _file;
Void Function(Void);
CALLBACK_DECLARE_SFXFILE(_SFXFile_OnRead)
};
Void MyClass::Function(Void)
{
SFXPath path("/dir1/data.txt");
// ファイルを読み込みモードでオープンする
if (_file.OpenReadOnly(path) == SFERR_NO_ERROR) {
// ファイルからデータを読み込むようにスケジューリングする
_file.ScheduleRead(CALLBACK_FUNCTION(_SFXFile_OnRead));// コールバック関数を登録する
}
}
// コールバック関数
CALLBACK_IMPLEMENT_SFXFILE(MyClass, _SFXFile_OnRead, error)
{
SFXBuffer buffer;
UInt32 size;
buffer.SetSize(32); // データを読み込むためのバッファを確保する
size = buffer.GetSize();
// ファイルから buffer へデータを読み込む
switch (_file.Read(buffer.GetBuffer(), &size)) {
case SFERR_NO_ERROR:
// 読み込んだデータを表示する
buffer.SetSize(size + 1);
buffer[buffer.GetSize() + 1] = '\0';
TRACE("%s", SFXAnsiString(buffer).GetCString());
// ファイルからデータを読み込むようにスケジューリングする
_file.ScheduleRead(CALLBACK_FUNCTION(_SFXFile_OnRead)); // コールバック関数を登録する
break;
case EFILEEOF:
_file.Close(); // ファイルをクローズする
break;
case AEE_STREAM_WOULDBLOCK:
// ファイルからデータを読み込むようにスケジューリングする
_file.ScheduleRead(CALLBACK_FUNCTION(_SFXFile_OnRead)); // コールバック関数を登録する
break;
}
return;
}
[ public, virtual ] SFCError ScheduleWrite( CallbackSPP spp // コールバック関数のポインター VoidPtr reference // コールバック関数に渡すユーザーデータ );
SFERR_UNSUPPORTED を返します。
ファイル ポインターを前方に移動する場合は、移動量 ( distance パラメーター ) に負の値を指定します。
ファイルを読み込み専用モードでオープンしているとき、 移動後のファイル ポインターの位置がファイルの先頭よりも前方または末尾よりも後方になる場合、この操作は失敗します。
ファイルを読み書きモードでオープンしているとき、 移動後のファイル ポインターの位置がファイルの末尾を越える場合、ファイルはその位置まで拡張されます。 また、移動後のファイル ポインターの位置がファイルの先頭よりも前になる場合は、この操作は失敗します。
ファイル ポインターを前方に移動する場合は、移動量 ( distance パラメーター ) に負の値を指定します。
ファイルを読み込み専用モードでオープンしているとき、 移動後のファイル ポインターの位置がファイルの先頭よりも前方または末尾よりも後方になる場合、この操作は失敗します。
ファイルを読み書きモードでオープンしているとき、 移動後のファイル ポインターの位置がファイルの末尾を越える場合、ファイルはその位置まで拡張されます。 また、移動後のファイル ポインターの位置がファイルの先頭よりも前になる場合は、この操作は失敗します。
ファイル ポインターを前方に移動する場合は、移動量 ( distance パラメーター ) に負の値を指定します。
ファイルを読み込み専用モードでオープンしているとき、 移動後のファイル ポインターの位置がファイルの先頭よりも前方または末尾よりも後方になる場合、この操作は失敗します。
ファイルを読み書きモードでオープンしているとき、 移動後のファイル ポインターの位置がファイルの末尾を越える場合、ファイルはその位置まで拡張されます。 また、移動後のファイル ポインターの位置がファイルの先頭よりも前になる場合は、この操作は失敗します。
[ public, const ] UInt32 Tell(Void);
// 現在の位置でファイルを切り詰める
file.Truncate(file.Tell());
// 現在の位置でファイルを切り捨てる
file.Truncate(file.Tell());
[ public, virtual ] SFCError Write( VoidConstPtr buffer // 書き込むバッファのポインター UInt32Ptr size // 書き込むバイト数、書き込んだバイト数を受け取るポインター );
書き込むデータを指定します。
SFXFile::Write 関数の呼び出し時は、書き込むデータのサイズを指定します。SFXFile::Write 関数が終了すると、実際に書き込んだデータのサイズが格納されます。
|
Copyright (C) 2002 - 2008 Sophia Cradle Incorporated All Rights Reserved. |
![]() ![]() ![]()
|