1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: fs_FileStream.h 4 5 Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Rev: 31495 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NN_FS_FS_FILESTREAM_H_ 17 #define NN_FS_FS_FILESTREAM_H_ 18 19 #include <nn/fs/fs_IStream.h> 20 #include <nn/fs/fs_FileBase.h> 21 #include <nn/fnd/fnd_Storage.h> 22 23 namespace nn { namespace fs { 24 25 /*! 26 :category ファイル・ディレクトリ操作 27 @brief ファイルを読み書きするためのクラスです。 28 29 パス名で指定されたファイルを開き、データを読み書きできます。@n 30 パス名の指定には、ワイド文字列とマルチバイト文字列の両方が使えますが、 31 特別な理由が無い限りは、ワイド文字列を使うようにしてください。 32 33 拡張セーブデータの場合、このクラスを使用してファイルを新規に作成することはできません。 34 サイズ指定のある @ref TryCreateFile 関数を使用してください。 35 36 */ 37 class FileStream : public IStream, public detail::FileBase, private nn::util::NonCopyable<FileStream> 38 { 39 public: 40 41 /*! 42 @brief コンストラクタです。 43 44 引数の無いオーバロードでは、ファイルは開きません。ファイルを操作するためには、別途 @ref Initialize を呼ぶ必要があります。 45 46 openMode 引数の詳細については、@ref OpenMode を参照してください。 47 */ FileStream()48 FileStream() {} 49 50 /*! 51 @brief オブジェクトを構築し、指定されたファイルを開くコンストラクタです。 52 53 指定されたパスのファイルを指定された OpenMode で開きます。 54 55 なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で 56 ファイルを作成しておく必要があります。 57 58 この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。 59 基本的に @ref TryInitialize を使うようにしてください。 60 61 @param[in] pathName 開くファイルのパス 62 @param[in] openMode ファイルを開くモード 63 */ FileStream(const wchar_t * pathName,bit32 openMode)64 FileStream(const wchar_t* pathName, bit32 openMode) : detail::FileBase(pathName, openMode) {} 65 66 /*! 67 @brief オブジェクトを構築し、指定されたファイルを開くコンストラクタです。 68 69 指定されたパスのファイルを指定された OpenMode で開きます。@n 70 この関数では、内部でパス名をマルチバイト文字列からワイド文字列に変換するために、 71 大きくスタック上にバッファを取るので、スタックの大きさには注意してください。 72 73 なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で 74 ファイルを作成しておく必要があります。 75 76 この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。 77 基本的に @ref TryInitialize を使うようにしてください。 78 79 @param[in] pathName 開くファイルのパス 80 @param[in] openMode ファイルを開くモード 81 */ FileStream(const char * pathName,bit32 openMode)82 FileStream(const char* pathName, bit32 openMode) : detail::FileBase(pathName, openMode) {} 83 84 /*! 85 @brief 指定されたファイルを開きます。 86 87 指定されたパスのファイルを指定された OpenMode で開きます。@n 88 指定されたパスにファイルが存在しない場合は、ファイルを作成してから書き込み専用で開きます。 89 既にこのオブジェクトでファイルを開いている場合に呼ぶことはできません。 90 91 なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で 92 ファイルを作成しておく必要があります。 93 94 openMode 引数の詳細については、@ref OpenMode を参照してください。 95 96 この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。 97 基本的に @ref TryInitialize を使うようにしてください。 98 99 @param[in] pathName 開くファイルのパス 100 @param[in] openMode ファイルを開くモード 101 */ Initialize(const wchar_t * pathName,bit32 openMode)102 void Initialize(const wchar_t* pathName, bit32 openMode) { detail::FileBase::Initialize(pathName, openMode); } 103 104 /*! 105 @brief 指定されたファイルを開きます。 106 107 指定されたパスのファイルを指定された OpenMode で開きます。@n 108 指定されたパスにファイルが存在しない場合は、ファイルを作成してから書き込み専用で開きます。 109 既にこのオブジェクトでファイルを開いている場合に呼ぶことはできません。@n 110 この関数では、内部でパス名をマルチバイト文字列からワイド文字列に変換するために、 111 大きくスタック上にバッファを取るので、スタックの大きさには注意してください。 112 113 なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で 114 ファイルを作成しておく必要があります。 115 116 この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。 117 基本的に @ref TryInitialize を使うようにしてください。 118 119 @param[in] pathName 開くファイルのパス 120 @param[in] openMode ファイルを開くモード 121 */ Initialize(const char * pathName,bit32 openMode)122 void Initialize(const char* pathName, bit32 openMode) { detail::FileBase::Initialize(pathName, openMode); } 123 124 /*! 125 @brief 指定されたファイルを開きます。 126 127 指定されたパスのファイルを指定された OpenMode で開きます。@n 128 指定されたパスにファイルが存在しない場合は、ファイルを作成してから書き込み専用で開きます。 129 ファイルを開く途中でエラーが発生した場合は、そのエラーを返します。 130 既にこのオブジェクトでファイルを開いている場合に呼ぶことはできません。 131 132 なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で 133 ファイルを作成しておく必要があります。 134 135 openMode 引数の詳細については、@ref OpenMode を参照してください。 136 137 @param[in] pathName 開くファイルのパス 138 @param[in] openMode ファイルを開くモード 139 */ TryInitialize(const wchar_t * pathName,bit32 openMode)140 nn::Result TryInitialize(const wchar_t* pathName, bit32 openMode) { return detail::FileBase::TryInitialize(pathName, openMode); } 141 142 /*! 143 @brief 指定されたファイルを開きます。 144 145 指定されたパスのファイルを指定された OpenMode で開きます。@n 146 指定されたパスにファイルが存在しない場合は、ファイルを作成してから書き込み専用で開きます。 147 ファイルを開く途中でエラーが発生した場合は、そのエラーを返します。@n 148 この関数では、内部でパス名をマルチバイト文字列からワイド文字列に変換するために、 149 大きくスタック上にバッファを取るので、スタックの大きさには注意してください。 150 151 なお、拡張セーブデータの場合、本関数を呼ぶ前に明示的に @ref nn::fs::TryCreateFile で 152 ファイルを作成しておく必要があります。 153 154 @param[in] pathName 開くファイルのパス 155 @param[in] openMode ファイルを開くモード 156 */ TryInitialize(const char * pathName,bit32 openMode)157 nn::Result TryInitialize(const char* pathName, bit32 openMode) { return detail::FileBase::TryInitialize(pathName, openMode); } 158 159 /*! 160 @brief ファイルを閉じます。 161 162 ファイルを閉じます。ファイルが開かれていなかった場合は何もしません。 163 */ Finalize()164 void Finalize() { detail::FileBase::Finalize(); } 165 166 /*! 167 @brief デストラクタです。 168 169 ファイルが開かれていればファイルを閉じます。 170 */ ~FileStream()171 virtual ~FileStream() {} 172 173 /*! 174 @brief ファイルから指定サイズをバッファに読み込みます。 175 176 ファイルの現在位置から最大 size バイトデータを読み込み、 177 buffer で指定されたアドレスの領域にコピーします。 178 179 この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。 180 基本的に @ref TryRead を使うようにしてください。 181 182 @param[in] buffer コピー先のバッファへのポインタ 183 @param[in] size コピーする最大バイト数 184 185 @return 実際にコピーしたバイト数を返します。ファイルの終端に達したときは 0 を返します。 186 */ Read(void * buffer,size_t size)187 virtual s32 Read(void* buffer, size_t size) { return detail::FileBase::Read(buffer, size); } 188 189 /*! 190 @brief ファイルから指定サイズをバッファに読み込みます。 191 192 ファイルの現在位置から最大 size バイトデータを読み込み、 193 buffer で指定されたアドレスの領域にコピーします。 194 195 @param[out] pOut 実際にコピーしたバイト数が格納されます。ファイルの終端に達したときは 0 が格納されます。 196 @param[in] buffer コピー先のバッファへのポインタ 197 @param[in] size コピーする最大バイト数 198 199 @return 処理の結果を返します。 200 */ TryRead(s32 * pOut,void * buffer,size_t size)201 virtual Result TryRead(s32* pOut, void* buffer, size_t size) { return detail::FileBase::TryRead(pOut, buffer, size); } 202 203 /*! 204 @brief バッファから指定サイズをファイルに書き込みます。 205 206 buffer で指定されたアドレスの領域にから、 207 最大 size バイトをファイルに書き込みます。 208 209 引数の flush に false を指定したときは、インスタンスを破棄する前に必ず 210 @ref TryFlush 関数を呼び出してください。 211 212 この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。 213 基本的に @ref TryWrite を使うようにしてください。 214 215 @param[in] buffer 書き込むデータが含まれているバッファへのポインタ 216 @param[in] size ファイルに書き込む最大バイト数 217 @param[in] flush デバイスへの書き戻しを行なうか指定します。 218 219 @return 実際に書き込んだバイト数を返します。 220 */ 221 virtual s32 Write(const void* buffer, size_t size, bool flush=true) { return detail::FileBase::Write(buffer, size, flush); } 222 223 /*! 224 @brief バッファから指定サイズをファイルに書き込みます。 225 226 buffer で指定されたアドレスの領域にから、 227 最大 size バイトをファイルに書き込みます。 228 229 引数の flush に false を指定したときは、インスタンスを破棄する前に必ず 230 @ref TryFlush 関数を呼び出してください。 231 232 @param[out] pOut 実際に書き込んだバイト数が格納されます。 233 @param[in] buffer 書き込むデータが含まれているバッファへのポインタ 234 @param[in] size ファイルに書き込む最大バイト数 235 @param[in] flush デバイスへの書き戻しを行なうか指定します。 236 237 @return 処理の結果を返します。 238 */ 239 virtual Result TryWrite(s32* pOut, const void* buffer, size_t size, bool flush=true) { return detail::FileBase::TryWrite(pOut, buffer, size, flush); } 240 241 /*! 242 @brief ファイルの読み込み・書き込み位置を変更します。 243 244 base で指定された位置から position 離れた場所に読み込み・書き込み位置を設定します。 245 246 この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。 247 基本的に @ref TrySeek を使うようにしてください。 248 249 @param[in] base 読み込み・書き込み位置の変更する基準を指定します。 250 @param[in] position 読み込み・書き込み位置の変更する位置を指定します。 251 */ Seek(s64 position,PositionBase base)252 virtual void Seek(s64 position, PositionBase base) { detail::FileBase::Seek(position, base); } 253 254 /*! 255 @brief ファイルの読み出し位置を変更します。 256 257 base で指定された位置から position 離れた場所に読み出し位置を設定します。 258 259 @param[in] base 読み出し位置の変更する基準を指定します。 260 @param[in] position 読み出し位置の変更する位置を指定します。 261 262 @return 処理の結果を返します。 263 */ TrySeek(s64 position,PositionBase base)264 virtual Result TrySeek(s64 position, PositionBase base) { return detail::FileBase::TrySeek(position, base); } 265 266 /*! 267 @brief ファイル先頭から数えた現在の読み出し位置を取得します。 268 269 この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。 270 基本的に @ref TryGetPosition を使うようにしてください。 271 272 @return 現在の位置を返します。 273 */ GetPosition()274 virtual s64 GetPosition() const { return detail::FileBase::GetPosition(); } 275 276 /*! 277 @brief ファイル先頭から数えた現在の読み出し位置を取得します。 278 279 @param[out] pOut 現在の位置が格納されます。 280 281 @return 処理の結果を返します。 282 */ TryGetPosition(s64 * pOut)283 virtual Result TryGetPosition(s64* pOut) const { return detail::FileBase::TryGetPosition(pOut); } 284 285 /*! 286 @brief ファイル先頭から数えた現在の読み出し位置を設定します。 287 288 この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。 289 基本的に @ref TrySetPosition を使うようにしてください。 290 291 @param[in] position 読み出し位置を指定します。 292 */ SetPosition(s64 position)293 virtual void SetPosition(s64 position) { detail::FileBase::SetPosition(position); } 294 295 /*! 296 @brief ファイル先頭から数えた現在の読み出し位置を設定します。 297 298 @param[in] position 読み出し位置を指定します。 299 300 @return 処理の結果を返します。 301 */ TrySetPosition(s64 position)302 virtual Result TrySetPosition(s64 position) { return detail::FileBase::TrySetPosition(position); } 303 304 /*! 305 @brief ファイルサイズを取得します。 306 307 この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。 308 基本的に @ref TryGetSize を使うようにしてください。 309 310 @return ファイルサイズを返します。 311 */ GetSize()312 virtual s64 GetSize() const { return detail::FileBase::GetSize(); } 313 314 /*! 315 @brief ファイルサイズを取得します。 316 317 @param[out] pOut ファイルサイズが格納されます。 318 319 @return 処理の結果を返します。 320 */ TryGetSize(s64 * pOut)321 virtual Result TryGetSize(s64* pOut) const { return detail::FileBase::TryGetSize(pOut); } 322 323 /*! 324 @brief ファイルサイズを設定します。 325 326 この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。 327 基本的に @ref TrySetSize を使うようにしてください。 328 329 @param[in] size ファイルサイズを指定します。 330 */ SetSize(s64 size)331 virtual void SetSize(s64 size) { detail::FileBase::SetSize(size); } 332 333 /*! 334 @brief ファイルサイズを設定します。 335 336 @param[in] size ファイルサイズを指定します。 337 338 @return 処理の結果を返します。 339 */ TrySetSize(s64 size)340 virtual Result TrySetSize(s64 size) { return detail::FileBase::TrySetSize(size); } 341 342 /*! 343 @brief ファイルキャッシュをデバイスに書き戻します。 344 345 この関数は、処理の結果を返さないためエラーハンドリングを行なうことができません。 346 基本的に @ref TryFlush を使うようにしてください。 347 348 */ Flush()349 virtual void Flush() { detail::FileBase::Flush(); } 350 351 /*! 352 @brief ファイルキャッシュをデバイスに書き戻します。 353 354 @return 処理の結果を返します。 355 */ TryFlush()356 virtual Result TryFlush() { return detail::FileBase::TryFlush(); } 357 }; 358 359 }} 360 361 #endif 362