/*---------------------------------------------------------------------------* Project: Horizon File: fs_FileStream.h Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: 33174 $ *---------------------------------------------------------------------------*/ #ifndef NN_FS_FS_FILESTREAM_H_ #define NN_FS_FS_FILESTREAM_H_ #include #include #include namespace nn { namespace fs { /*! :category ファイル・ディレクトリ操作 @brief ファイルを読み書きするためのクラスです。 パス名で指定されたファイルを開き、データを読み書きできます。 パス名の指定には、ワイド文字列とマルチバイト文字列の両方が使えますが、 特別な理由が無い限りは、ワイド文字列を使うようにしてください。 拡張セーブデータの場合、このクラスを使用してファイルを新規に作成することはできません。 サイズ指定のある @ref TryCreateFile 関数を使用してください。 */ class FileStream : public IStream, public detail::FileBase, private nn::util::NonCopyable { public: /*! :overload noparam @brief コンストラクタです。 引数の無いオーバロードでは、ファイルは開きません。ファイルを操作するためには、別途 @ref TryInitialize を呼ぶ必要があります。 */ FileStream() {} /*! :overload wcharparam @brief オブジェクトを構築し、指定されたファイルを開くコンストラクタです。 指定されたパスのファイルを指定された OpenMode で開きます。 なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で ファイルを作成しておく必要があります。 openMode 引数の詳細については、@ref OpenMode を参照してください。 拡張セーブデータに対して OPEN_MODE_CREATE を指定するとエラーになる点に注意してください。 @param[in] pathName 開くファイルのパス @param[in] openMode ファイルを開くモード */ FileStream(const wchar_t* pathName, bit32 openMode) : detail::FileBase(pathName, openMode) {} /*! :overload charparam @brief オブジェクトを構築し、指定されたファイルを開くコンストラクタです。 指定されたパスのファイルを指定された OpenMode で開きます。 この関数では、内部でパス名をマルチバイト文字列からワイド文字列に変換するために、 大きくスタック上にバッファを取るので、スタックの大きさには注意してください。 なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で ファイルを作成しておく必要があります。 openMode 引数の詳細については、@ref OpenMode を参照してください。 拡張セーブデータに対して OPEN_MODE_CREATE を指定するとエラーになる点に注意してください。 @param[in] pathName 開くファイルのパス @param[in] openMode ファイルを開くモード */ FileStream(const char* pathName, bit32 openMode) : detail::FileBase(pathName, openMode) {} /*! :overload wcharparam @brief 指定されたファイルを開きます。 指定されたパスのファイルを指定された OpenMode で開きます。@n 指定されたパスにファイルが存在しない場合は、ファイルを作成してから書き込み専用で開きます。 既にこのオブジェクトでファイルを開いている場合に呼ぶことはできません。 なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で ファイルを作成しておく必要があります。 openMode 引数の詳細については、@ref OpenMode を参照してください。 拡張セーブデータに対して OPEN_MODE_CREATE を指定するとエラーになる点に注意してください。 @param[in] pathName 開くファイルのパス @param[in] openMode ファイルを開くモード */ void Initialize(const wchar_t* pathName, bit32 openMode) { detail::FileBase::Initialize(pathName, openMode); } /*! :overload charparam @brief 指定されたファイルを開きます。 指定されたパスのファイルを指定された OpenMode で開きます。@n 指定されたパスにファイルが存在しない場合は、ファイルを作成してから書き込み専用で開きます。 既にこのオブジェクトでファイルを開いている場合に呼ぶことはできません。 この関数では、内部でパス名をマルチバイト文字列からワイド文字列に変換するために、 大きくスタック上にバッファを取るので、スタックの大きさには注意してください。 なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で ファイルを作成しておく必要があります。 openMode 引数の詳細については、@ref OpenMode を参照してください。 拡張セーブデータに対して OPEN_MODE_CREATE を指定するとエラーになる点に注意してください。 @param[in] pathName 開くファイルのパス @param[in] openMode ファイルを開くモード */ void Initialize(const char* pathName, bit32 openMode) { detail::FileBase::Initialize(pathName, openMode); } /*! :overload wcharparam @brief 指定されたファイルを開きます。 指定されたパスのファイルを指定された OpenMode で開きます。@n 指定されたパスにファイルが存在しない場合は、ファイルを作成してから書き込み専用で開きます。 既にこのオブジェクトでファイルを開いている場合に呼ぶことはできません。 ファイルを開く途中でエラーが発生した場合は、そのエラーを返します。 なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で ファイルを作成しておく必要があります。 openMode 引数の詳細については、@ref OpenMode を参照してください。 拡張セーブデータに対して OPEN_MODE_CREATE を指定するとエラーになる点に注意してください。 @param[in] pathName 開くファイルのパス @param[in] openMode ファイルを開くモード @return 処理の結果を返します。 */ nn::Result TryInitialize(const wchar_t* pathName, bit32 openMode) { return detail::FileBase::TryInitialize(pathName, openMode); } /*! :overload charparam @brief 指定されたファイルを開きます。 指定されたパスのファイルを指定された OpenMode で開きます。@n 指定されたパスにファイルが存在しない場合は、ファイルを作成してから書き込み専用で開きます。 ファイルを開く途中でエラーが発生した場合は、そのエラーを返します。 この関数では、内部でパス名をマルチバイト文字列からワイド文字列に変換するために、 大きくスタック上にバッファを取るので、スタックの大きさには注意してください。 なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で ファイルを作成しておく必要があります。 openMode 引数の詳細については、@ref OpenMode を参照してください。 拡張セーブデータに対して OPEN_MODE_CREATE を指定するとエラーになる点に注意してください。 @param[in] pathName 開くファイルのパス @param[in] openMode ファイルを開くモード @return 処理の結果を返します。 */ nn::Result TryInitialize(const char* pathName, bit32 openMode) { return detail::FileBase::TryInitialize(pathName, openMode); } /*! @brief ファイルを閉じます。 ファイルを閉じます。ファイルが開かれていなかった場合は何もしません。 */ void Finalize() { detail::FileBase::Finalize(); } /*! @brief デストラクタです。 ファイルが開かれていればファイルを閉じます。 */ virtual ~FileStream() {} /*! @brief ファイルから指定サイズをバッファに読み込みます。 ファイルの現在位置から最大 size バイトデータを読み込み、buffer で指定されたアドレスの領域にコピーします。 @param[in] buffer コピー先のバッファへのポインタ @param[in] size コピーする最大バイト数 @return 実際にコピーしたバイト数を返します。ファイルの終端に達したときは 0 を返します。 */ virtual s32 Read(void* buffer, size_t size) { return detail::FileBase::Read(buffer, size); } /*! @brief ファイルから指定サイズをバッファに読み込みます。 ファイルの現在位置から最大 size バイトデータを読み込み、buffer で指定されたアドレスの領域にコピーします。 @param[out] pOut 実際にコピーしたバイト数が格納されます。ファイルの終端に達したときは 0 が格納されます。 @param[in] buffer コピー先のバッファへのポインタ @param[in] size コピーする最大バイト数 @return 処理の結果を返します。 */ virtual Result TryRead(s32* pOut, void* buffer, size_t size) { return detail::FileBase::TryRead(pOut, buffer, size); } /*! @brief バッファから指定サイズをファイルに書き込みます。 buffer で指定されたアドレスの領域にから、最大 size バイトをファイルに書き込みます。 引数の flush に false を指定したときは、@ref Finalize を呼び出すまでに flush を true にしてこの関数を呼び出すか、 @ref TryFlush 関数を呼び出してください。 @param[in] buffer 書き込むデータが含まれているバッファへのポインタ @param[in] size ファイルに書き込む最大バイト数 @param[in] flush デバイスへの書き戻しを行なうか指定します。 @return 実際に書き込んだバイト数を返します。 */ virtual s32 Write(const void* buffer, size_t size, bool flush=true) { return detail::FileBase::Write(buffer, size, flush); } /*! @brief バッファから指定サイズをファイルに書き込みます。 buffer で指定されたアドレスの領域にから、最大 size バイトをファイルに書き込みます。 引数の flush に false を指定したときは、@ref Finalize を呼び出すまでに flush を true にしてこの関数を呼び出すか、 @ref TryFlush 関数を呼び出してください。 @param[out] pOut 実際に書き込んだバイト数が格納されます。 @param[in] buffer 書き込むデータが含まれているバッファへのポインタ @param[in] size ファイルに書き込む最大バイト数 @param[in] flush デバイスへの書き戻しを行なうか指定します。 @return 処理の結果を返します。 */ virtual Result TryWrite(s32* pOut, const void* buffer, size_t size, bool flush=true) { return detail::FileBase::TryWrite(pOut, buffer, size, flush); } /*! @brief ファイルの読み込み・書き込み位置を変更します。 base で指定された位置から position 離れた場所に読み込み・書き込み位置を設定します。 @param[in] base 読み込み・書き込み位置の変更する基準を指定します。 @param[in] position 読み込み・書き込み位置の変更する位置を指定します。 */ virtual void Seek(s64 position, PositionBase base) { detail::FileBase::Seek(position, base); } /*! @brief ファイルの読み出し位置を変更します。 base で指定された位置から position 離れた場所に読み出し位置を設定します。 @param[in] base 読み出し位置の変更する基準を指定します。 @param[in] position 読み出し位置の変更する位置を指定します。 @return 処理の結果を返します。 */ virtual Result TrySeek(s64 position, PositionBase base) { return detail::FileBase::TrySeek(position, base); } /*! @brief ファイル先頭から数えた現在の読み出し位置を取得します。 @return 現在の位置を返します。 */ virtual s64 GetPosition() const { return detail::FileBase::GetPosition(); } /*! @brief ファイル先頭から数えた現在の読み出し位置を取得します。 @param[out] pOut 現在の位置が格納されます。 @return 処理の結果を返します。 */ virtual Result TryGetPosition(s64* pOut) const { return detail::FileBase::TryGetPosition(pOut); } /*! @brief ファイル先頭から数えた現在の読み出し位置を設定します。 @param[in] position 読み出し位置を指定します。 */ virtual void SetPosition(s64 position) { detail::FileBase::SetPosition(position); } /*! @brief ファイル先頭から数えた現在の読み出し位置を設定します。 @param[in] position 読み出し位置を指定します。 @return 処理の結果を返します。 */ virtual Result TrySetPosition(s64 position) { return detail::FileBase::TrySetPosition(position); } /*! @brief ファイルサイズを取得します。 @return ファイルサイズを返します。 */ virtual s64 GetSize() const { return detail::FileBase::GetSize(); } /*! @brief ファイルサイズを取得します。 @param[out] pOut ファイルサイズが格納されます。 @return 処理の結果を返します。 */ virtual Result TryGetSize(s64* pOut) const { return detail::FileBase::TryGetSize(pOut); } /*! @brief ファイルサイズを設定します。 @param[in] size ファイルサイズを指定します。 */ virtual void SetSize(s64 size) { detail::FileBase::SetSize(size); } /*! @brief ファイルサイズを設定します。 @param[in] size ファイルサイズを指定します。 @return 処理の結果を返します。 */ virtual Result TrySetSize(s64 size) { return detail::FileBase::TrySetSize(size); } /*! @brief ファイルキャッシュをデバイスに書き戻します。 */ virtual void Flush() { detail::FileBase::Flush(); } /*! @brief ファイルキャッシュをデバイスに書き戻します。 @return 処理の結果を返します。 */ virtual Result TryFlush() { return detail::FileBase::TryFlush(); } }; }} #endif