• 締切済み

GetFileSizeの最大

GetFileSizeは関数が失敗すれば、0xFFFFFFFFを返します。 説明のために、DWORDが4ビットだったとすると、 GetFileSizeが失敗して 1111が返ることになると思います。 そうすると、返り値で得られる最大サイズは0111ですか? 第2引数を使った場合は、0111と1111を合わせたものが最大サイズで、 実際だと、01111111111111111111111111111111と、1が32個を合わせた、 16進数だと、7FFFFFFFとFFFFFFFFを合わせた、 10進数だと、2147483647と4294967295を合わせた 6442450942 (6ギガぐらい) が、GetFileSizeで得ることができる 最大ファイルサイズですか?

  • A__
  • お礼率59% (194/328)

みんなの回答

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>教えてくれた2の64乗バイトとはGetFileSizeで得ることができる最大ファイルサイズのことですか? そうです。 32bitの数値を2つ使って64bitの数値を表すのですから。 正確には FFFFFFFFFFFFFFFF = 2の64乗 - 1 =18446744073709551615 となります。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>そうすると、返り値で得られる最大サイズは0111ですか? いいえ、1110です。 >第2引数を使った場合は、0111と1111を合わせたものが最大サイズで いいえ、11111111です。 GetLastErrorで成功、失敗を判断する必要があります。 >10進数だと、2147483647と4294967295を合わせた >6442450942 (6ギガぐらい) が、GetFileSizeで得ることができる >最大ファイルサイズですか? なぜ足し算するんですか? 2の64乗バイトでは? FFFFFFFFFFFFFFFFバイトですよ。

A__
質問者

補足

足し算したのは勘違いでした。 教えてくれた2の64乗バイトとはGetFileSizeで得ることができる最大ファイルサイズのことですか?

関連するQ&A

  • 返り値と引数が知りたいのですが。

    クラスCFileのメンバー関数の機能でOPENとREADの返り値と引数が知りたいのですが。 自分でも調べたんですが。 READの返り値はUINTで引数はvoid* pBufferとUINT nCountであってるでしょうか? OPENの返り値はBOOLでいいのでしょうか?引数がわかりませんでした。 それと機能の意味なんですがOPENはファイルを開く以外にも意味はあるのでしょうか。 よろしくお願いします。

  • FormatMessageでのバッファサイズの指定

    FormatMessageでのバッファサイズの指定 DWORD FormatMessage( DWORD dwFlags, // 入力元と処理方法のオプション LPCVOID lpSource, // メッセージの入力元 DWORD dwMessageId, // メッセージ識別子 DWORD dwLanguageId, // 言語識別子 LPTSTR lpBuffer, // メッセージバッファ DWORD nSize, // メッセージバッファの最大サイズ va_list *Arguments // 複数のメッセージ挿入シーケンスからなる配列 ); 上記関数にて、「DWORD nSize, // メッセージバッファの最大サイズ」のところで バッファサイズの最大値を指定したいのですが、仕様を見ると 「0以外の値は、出力行の最大の文字数を表します。」となっています。 しかし、バイト数で指定したいのです。(2048バイト) 何か解決策、良い方法はありますでしょうか? よろしかったらご教授よろしくお願いいたします。

  • SDKにて

    最近”猫でもわかる”でSDKの勉強を始めました。 現在第76章を勉強中なのですが、この章で躓いております。 分からない部分は最後の文字列検索部分。 dwCurPos = SendMessage(hEdit, EM_GETSEL, 0, 0); この章の始めにこの関数の返り値として、選択されている(黒く塗られている)部分の先頭文字のアドレスが下位ワードとして格納されていると説明があります。 よって自然に、返り値を DWORD型 で宣言すれば良いと分かりました。 しかしその後こんなことを行っています。 dwPos = LOWORD(dwCurPos); dwPosは DWORD型で宣言されているのですが、これはdwCurPosの下位ワードのみdwPosに代入していると考えてよいのでしょうか? そしてその後 lpFindPoint = strstr(&buf[LOWORD(dwPos)], lpfr->lpstrFindWhat); のように記述されています。 この関数の意味は第一引数の文字列内に、第二引数の文字列が発見された場合、最初に出現した場所のポインタを返す関数と説明があります。 それは分かるのですが、気になるのが第一引数です。 &buf[LOWORD(dwPos)] 先ほどのプログラムで下位ワードのみ代入された?dwPosの下位ワードを配列の変数として扱っています。 たしかにDWORDは32bitであり下位ワードならば16bitとなるので、int型とサイズは合うのですが、このLOWORD(dwPos)をint型として扱ってよいのでしょうか? いや、そのように扱っても問題はないのでしょうか? そして最後に dwPos = lpFindPoint - buf; のように書かれています。 lpFindPointおよびbufはアドレスであり、dwPosは先ほど同様DWORD型で宣言されています。 この計算式の結果dwPosにはどんな値が格納されるのか考えられないのですが、予想としてはこの二つのアドレスの差をunsigned long型にキャストして格納していると考えているんですが、こんな考えでよいのでしょうか? なにぶん一人で勉強しているので毎回毎回問題解決に苦労しています。 分かる方はご教授よろしくお願いします。

  • [Haskell]handle関数がうまくいかない

    RealWorldHaskellという本を読んでいて解決できないところがあったので質問します。 Control.Exceptionには例外を扱うhandle関数というものがあります。 型シグネチャは Exception e => (e -> IO a) -> IO a -> IO a です。 1つ目の引数に例外を捉えた場合実行する関数を、2つ目の引数に例外を投げる可能性のある関数を与えます。 1つ目の引数の関数の返り値の型と2つ目の引数の型は同じでなければなりません。 次の関数はhandle関数を利用して安全にファイルサイズを取得する(つもりで作った)関数です。 getFileSize :: FilePath -> IO (Maybe Integer) getFileSize path = handle (\_ -> return Nothing ) $ bracket (openFile path ReadMode) hClose $ \h -> do size <- hFileSize h return (Just size) この関数がうまくいきません。 具体的に言えばコンパイルすると handle (\_ -> return Nothing ) の部分で Ambiguous type variable `e0' in the constraint: とエラーは吐きます。 しかし、返り値の型はNothingでMaybe Integerと合致していると思います。 なのにAmbiguousです。 なぜこうなるのかわかりません。 ちなみにControl.OldExceptionでもhandle関数が定義されていますが、ghcのバージョンが新しいせいか(7.0.2)コンパイルできません。 なのでControl.Exceptionしか使えません。 よろしくお願いします。

  • PHPのusort関数について

    PHPにおけるusort関数およびuasort uksort関数の使い方がわかりません。 $array = array("b" => "bbbb","c" => "cc","d" => "ddddddddddd","e" => "eee","a" => "a","f" => "ffffffff","g" => "gg","h" => "hh"); 上記のような配列があった場合 uasort($array, function($a,$b){ if (strlen($a) == strlen($b)) { return 0; } if(strlen($a) > strlen($b)){ return -1; }else if(strlen($a) < strlen($b)){ return 1; } } ); print_r($array); 上記のようなコードの場合 ( [d] => ddddddddddd [f] => ffffffff [b] => bbbb [e] => eee [h] => hh [g] => gg [c] => cc [a] => a ) という結果がかえてきます。 ただ、実際このコードでなにがおきてるかわかりません。 まず、uasort関数の第二引数に渡す関数の引数 $a,$bはいったいどんな順番で第一引数の配列からわたされているのでしょうか? そして、$a と$ bの値が同じ場合に0を返した場合なにがおきてるのでしょうか? 同じく return 1;を返すときと return -1;を返すときと いったいどのような処理がおこなわれていてどういうなぜ 上記のような配列を返すことになるのでしょうか? そもそも PHPマニュアルから参照しますが 比較関数は、最初の引数と二番目の引数の比較結果を返します。最初の引数のほうが二番目の引数より大きい場合は正の数を、二番目の引数と等しい場合はゼロを、そして二番目の引数より小さい場合は負の数を返す必要があります。 上記説明も、どうにも理解できません。 どうも全体的にusort関数系の使い方がわかりません。 識者の方よろしくご教授いただけますようお願いします。

    • ベストアンサー
    • PHP
  • 文字列→数値変換ルーチン

    こんにちは。 16進数の文字列を数値に変換するルーチンを調査したところ、以下のサイトを発見することができました。 http://www.cisnet.or.jp/home/tsuneoka/win32sub/appendex.html ただし、このサイトのルーチンはDOS用に作成されているため、int = 16bit が前提になっており、変換するとき、0x7fffffff より大きい値(0xfffffffe)は変換できません。 このサイトのルーチンを改造して、変換可能な最大値を符号なし32bit(0xffffffff)にするには、どうしたらよいのでしょうか?

  • callocの最大確保サイズについて…

    こんにちは 久しぶりにここに来ましたが… それで、callocを使ってメモリの動的確保をする部分をプログラムに入れましたが、 現在私が使用しているLSI C-86 試食版というコンパイラで、 ヘッダファイルを見ると、callocの何個確保確保するかに当たるsize_t型が typedef unsigned size_t; と定義されています。 sizeof(size_t)で確認してみると、2バイト(16ビット)ということがわかりましたが、すると、 callocで最大が65536個分しか確保できないということになるはずでして… とりあえずソースファイルの一番最初に以下の4行を追加してみましたが実行すると見事にエラーが出ました^^; #ifndef __SIZE_T_DEFINED #define __SIZE_T_DEFINED typedef unsigned long size_t; #endif コンパイラによってはsize_t型が違うかもしれませんが… できれば64kb以上のメモリ確保をしたいので、何かいいアイデア(ライブラリ関数等)があれば暇なときにでもご教授お願いします。 長々となりましたが、よろしくお願いします。

  • 2のn乗+1

    nビットのハッシュ関数の出力は0から2のn乗の、合計すると2のn乗+1のパターンがあるってことで合ってますか? それとも0から2のn乗-1で、合計2のn乗パターンですか? もしくは0はなくて1から2のn乗までですか? 実際の出力をみると0000……FA16みたいなケースもあるので、そうすると全部0という出力も有り得るのですか? また最大値はn+1ビットも有り得るのですか?最大桁が1で残りが全て0とすると、2のn乗は2進数だと最大桁に1が来て、残りが全部0ですがその0の数は、n個になると思いますが、そうすると何々ビットのハッシュ関数といいつつ、最大値でみるとビット数は2のn乗+1となりますが、認識正しいでしょうか?

  • 【C言語】引数にファイルパスを送りたい

    DLLで外部のファイルサイズを得る関数を作っています。 C言語は書きながら覚えていこうとしているのですが、 どうしても分からない点がありました。 ソースをここに正しく書ける自信がないので日本語を含めて大体で書きます。 いろいろなサイトのコピペです。 double __stdcall filesize(){ HANDLE hFile; DWORD size; hFile = CreateFile( _T(絶対パス, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); size = GetFileSize( hFile, NULL ); CloseHandle( hFile ); return(size); } このような感じで書いていて最後にretuenでファイルサイズを正しく得ることができました。 この絶対パスは環境によって変わるので引数にしようと考えました。 そしてfilesize()の中にどのように記述すればいいかで躓いています。 filesize(絶対パス){ char pass[] = "絶対パス"; hFile = CreateFile( _T(pass, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); こんな感じで書ければいいのですがC言語はポインタや文字列の扱いが難しいですね。 初歩的なことで申し訳ありませんがよろしくお願いします。

  • 通信(送信)のプログラム

    bool WriteData(char *buff, unsigned int data_size) {     DWORD dwWritten; /* ポートへ書き込んだバイト数 */ WriteFile(hComm, buff, data_size, &dwWritten, NULL); if (dwWritten!=data_size) { printf("データの送信に失敗しました。\n"); return false; } return true; } 上の関数はシリアル通信の送信する関数なんですが、これに数値などを入れたいんですが、char型のため、一文字しか入れれません。たとえば、01ならchar型の0とchar型の1を別々に送らないとだめなんですが、このようにするしか無理なんでしょうか?int型の数値を好きなように入れて送りたいんですが。あと、OxFFのように16進数も入れれると便利なんですが。駄文ですいません。プログラムの知識が浅はかですいません。