HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0603
UNGA2G以上のファイルのサイズの取得10解決


UNGA

リンク

2022/6/3(Fri) 06:24:25|NO.96542

お世話になります。
HSPが2G以上のファイルを扱えないことはわかりました。その上で、それ以上のファイルサイズを取得するにはどうすればよいか、ご教授いただければ幸いです。



この記事に返信する


名無し

リンク

2022/6/3(Fri) 09:00:46|NO.96544

なぜ2GBの制限があるのか調べましたか?



UNGA

リンク

2022/6/3(Fri) 11:37:29|NO.96545

HSPが扱えるメモリーの上限が2GBであることが原因だと理解していますが……。



zrs90(5さい)

リンク

2022/6/3(Fri) 14:36:36|NO.96546

2G以上のファイル

ファイルサイズを取得

...でサイト内、外部サイト検索したかな?



usagi

リンク

2022/6/3(Fri) 19:51:57|NO.96550

ファイルサイズを知りたいのであれば、
符号付き32bit整数で扱える数字は-2,147,483,648〜2,147,483,647で2Gを超える数字を扱えないからですね。

読み込まないのでHSPのメモリの問題ではなく数字が扱えないからかと思います。

どこまで膨大なファイルサイズを扱いたいのか分かりませんが、
お使いのファイルシステムはNTFSですか?

HSPはWindowの機能が使えますので、kernel32のGetFileAttributesExを使えば
32bitを上位下位の二つに分けて取得してくれます。

一例ですが、サイズ取得できませんか?

#include "kernel32.as" dialog "", 16 : if stat == 0 { end } filename = refstr sdim info, 48 GetFileAttributesEx varptr(filename), 0, varptr(info) : if stat == 0 { end } nFileSizeHigh = lpeek(info, 0x20) nFileSizeLow = lpeek(info, 0x28) mes "上位32bit:"+nFileSizeHigh mes "下位32bit:"+nFileSizeLow



沢渡

リンク

2022/6/4(Sat) 19:12:53|NO.96558

少し前に「64bit整数演算DLL」というものを見つけましたが、
それを使えば、GetFileAttributesExを使って取得した「64bit符号なし整数」を
実数に変換できるようです。
(つまり、2GBを超えるファイルサイズであっても実数の形で取得できるということ)
以下のソースコードを実行する前に、このサイト↓からi64v0b1.lzhを
ダウンロードして、中に入っているI64.dllをソースコードと同じフォルダに
入れてください。
https://www.vector.co.jp/soft/dl/win95/prog/se240689.html

ただし、申し訳ありませんが当方には2GBを超えるサイズのファイルはないので、
そういったファイルでの実験は当方ではできませんでした。
また、ファイルサイズが大きくなると実数変換にあたって若干の誤差が発生しますが、
そこはご了承ください。

#include "kernel32.as" #module #uselib "I64.dll" #func U2F64 "U2F64" var,var #deffunc exist_ex str fname,var d,local fad,local s,local buf exist fname : if strsize=-1 : return -1 s=fname dim fad,9 //WIN32_FILE_ATTRIBUTE_DATA構造体 GetFileAttributesEx varptr(s),0,varptr(fad) d=0.0 : buf=0.0 lpoke buf,0,fad(8) : lpoke buf,4,fad(7) U2F64 buf,d if fad(7) : return -2 if fad(8)&0x80000000 : return -2 return fad(8) #global //使い方: //exist_ex p1,p2 //p1に指定したファイルの大きさを、p2に指定した変数に実数の形で代入する。 //ファイルが無い場合はstatに-1が返る。 //ファイルサイズがHSPの整数で表現できる範囲を超えている場合は、statに-2が入る。 //それ以外の場合はファイルサイズがstatに入る。 //(つまり、statが0以上の場合はstatをそのままファイルサイズとして扱えばよいし、 // statが-2の場合はp2に入った実数値をファイルサイズとして扱えばよい)



zrs90(5さい)

リンク

2022/6/4(Sat) 19:26:45|NO.96559

usagi さんと、沢渡 さん
ソースありがとうございました。

お二人とも、GetFileSizeEx でソース書いてませんが
この辺りの理由も、下記のスレッドから色々
調べれば分かります。

2G以上のファイル を、hsp3 で扱おうとする時点で
かなり無理があると思いますが
差しつかえなければ、目的と理由等を知りたいです。

ーーーーーーーーーーーーーーー

実は、サイト内検索で

http://hsp.tv/play/pforum.php?mode=pastwch&num=44868

...を探してもらうつもりでした。
(※私が Win32api を全く使えないだけ。)


沢渡さんもおっしゃってますが
2G 越えの単体ファイルって、普通持ってないので
実際、テストの方法がありません。
私の、手持ちのDVDの単体ファイルでも
約300MBでしたから。


後、ファイル自体をプロパティで見れば
サイズだけなら、分かります。
エクスプローラーのファイルサイズとは
計算方法が違う為、サイズが違うはずです。
(※場合によっては、ある程度時間かかると思います。)



UNGA

リンク

2022/6/5(Sun) 08:52:10|NO.96565

皆さま、色々とアドバイス有難うございました。
沢渡様に教えていただいたスクリプトでうまくいきそうなので、それでやってみたいと思います。
大変助かりました。自分でももっと勉強したいと思います。



ee

リンク

2022/6/5(Sun) 13:49:32|NO.96567

解決してますが一応。
64bit整数を実数に変換する方法は過去ログ見ればあると思いますが別途DLLは不要です。
ファイルサイズは以下の方法で実数値で取得できます。

#include "kernel32.as" dialog "", 16 : if stat == 0 { end } filename = refstr dim info, 9 GetFileAttributesEx varptr(filename), 0, varptr(info) : if stat == 0 { end } fsize=0.0 lpoke fsize,0,info(8) lpoke fsize,4,info(7) mes strf("%I64u",fsize) //文字列 fsize=double(strf("%I64u",fsize)) //実数へ変換



沢渡

リンク

2022/6/5(Sun) 16:59:05|NO.96569

うわぁ…ヘルプでstrfの説明読んだら、ちゃんと書いてあったじゃないですか。
別途「64bit整数を文字列に変換するモジュール」なんてのも作ってましたが、それも無駄に。
DLLダウンロードしてくださいとか手間掛けさせて、思いっきり恥かきました。
申し訳ありませんがNO.96558は無かったことにしてください。



沢渡

リンク

2022/6/5(Sun) 17:11:08|NO.96570

自分の尻拭いのためNO.96558を改修しましたので、こちらを使ってください。DLLは不要です。
お手数おかけしました。

#include "kernel32.as" #module #define global exist_ex(%1,%2,%3=0) _exist_ex %1,%2,%3 #deffunc _exist_ex str fname,var d,int flag,local fad,local s,local buf exist fname : if strsize=-1 : return -1 s=fname dim fad,9 //WIN32_FILE_ATTRIBUTE_DATA構造体 GetFileAttributesEx varptr(s),0,varptr(fad) buf=0.0 lpoke buf,0,fad(8) : lpoke buf,4,fad(7) d=strf("%I64u",buf) if flag=0 : d=double(d) if fad(7) : return -2 if fad(8)&0x80000000 : return -2 return fad(8) #global //使い方: //exist_ex p1,p2,p3 //p1に指定したファイルの大きさを、p2に指定した変数に代入する。 //p3に0を指定するか省略した場合はp2には実数形式で代入される。 //0以外を指定した場合は文字列形式で代入される。 //ファイルが無い場合はstatに-1が返る。 //ファイルサイズがHSPの整数で表現できる範囲を超えている場合は、statに-2が入る。 //それ以外の場合はファイルサイズがstatに入る。 //(つまり、statが0以上の場合はstatをそのままファイルサイズとして扱えばよいし、 // statが-2の場合はp2に入った実数値をファイルサイズとして扱えばよい)



ONION software Copyright 1997-2023(c) All rights reserved.