たとえばCドライブのフリーエリアを変数で得たいのですが
TYPE 文のオプションで >> を使って TXT に出し
それを、読み込んで数値化する方法以外に、なにか良い方法は
ないでしょうか?
ご存知の方がいらっしゃったらぜひご教示ください。
ディスクのフリーエリアを変数に取り込みたい
GetDiskFreeSpaceEx関数を使えばよいでしょう。
ABのULARGE_INTEGER構造体は少々曲者ですが,
別の宣言を作ってごまかすと言う方法もあります。
空き容量の取得自体はGetDiskFreeSpaceExAsQWordを使用するだけですが,
それだけでは意味のないプログラムになるので,この例では適当な単位に切り上げた文字列へ変換してくれるStrFormatByteSize64関数(要IE5)と
それをString型対応させたStrFormatByteSizeを使って,ユーザーが使える空き容量をPrintで表示させています。
ABのULARGE_INTEGER構造体は少々曲者ですが,
別の宣言を作ってごまかすと言う方法もあります。
コード: 全て選択
#strict
#prompt
Dim FreeSpace As QWord
GetDiskFreeSpaceExAsQWord("C:\", FreeSpace, ByVal 0, ByVal 0)
Print StringFormatByteSize(FreeSpace)
Declare Function GetDiskFreeSpaceExAsQWord Lib "kernel32" Alias "GetDiskFreeSpaceExA" (
ByVal pDirectoryName As *Byte,
ByRef FreeBytesAvailableToCaller As QWord,
ByRef TotalNumberOfBytes As QWord,
ByRef TotalNumberOfFreeBytes As QWord) As Long
Declare Function StrFormatByteSize64 Lib "shlwapi.dll" Alias "StrFormatByteSize64A" (
value As Int64,
pszBuf As *Byte,
uiBufSize As DWord) As *Byte
Function StringFormatByteSize(value As Int64) As String
Dim buffer[ELM(32)] As Byte
StrFormatByteSize64(value, buffer, Len(buffer))
StringFormatByteSize = buffer
End Function
それだけでは意味のないプログラムになるので,この例では適当な単位に切り上げた文字列へ変換してくれるStrFormatByteSize64関数(要IE5)と
それをString型対応させたStrFormatByteSizeを使って,ユーザーが使える空き容量をPrintで表示させています。
実は、わざわざ再度宣言しなくても使う方法はあります(^^;; かなり反則気味ですが。
コード: 全て選択
GetDiskFreeSpaceEx("C:\", ByVal VarPtr(FreeSpace), ByVal 0, ByVal 0)
[hira]
http://hira.hopto.org/
http://hira.hopto.org/
いろいろな方法をありがとうございます。
誠に恐れ入りますが、私は本来のN88BASICタイプでActiveBasicを使うことで
非常に利用しています。
ですので、
GetDiskFreeSpaceEx("C:\", ByVal VarPtr(FreeSpace), ByVal 0, ByVal 0)
print FreeSpace
とやってみたのですが、プリントできません。
すみませんが、もう少し先の部分までご教授いただけないでしょうか
非常に利用しています。
ですので、
GetDiskFreeSpaceEx("C:\", ByVal VarPtr(FreeSpace), ByVal 0, ByVal 0)
print FreeSpace
とやってみたのですが、プリントできません。
すみませんが、もう少し先の部分までご教授いただけないでしょうか
エラー(9行目)と出てしまうのですが・・・
エラーになってしまいますが
バージョンは262です。
> GetDiskFreeSpaceEx関数を使えばよいでしょう。
> ABのULARGE_INTEGER構造体は少々曲者ですが,
> 別の宣言を作ってごまかすと言う方法もあります。
>
> 空き容量の取得自体はGetDiskFreeSpaceExAsQWordを使用するだけですが,
> それだけでは意味のないプログラムになるので,この例では適当な単位に切り上げた文字列へ変換してくれるStrFormatByteSize64関数(要IE5)と
> それをString型対応させたStrFormatByteSizeを使って,ユーザーが使える空き容量をPrintで表示させています。
バージョンは262です。
> GetDiskFreeSpaceEx関数を使えばよいでしょう。
> ABのULARGE_INTEGER構造体は少々曲者ですが,
> 別の宣言を作ってごまかすと言う方法もあります。
>
コード: 全て選択
#strict
> #prompt
>
> Dim FreeSpace As QWord
> GetDiskFreeSpaceExAsQWord("C:\", FreeSpace, ByVal 0, ByVal 0)
>
> Print StringFormatByteSize(FreeSpace)
>
> Declare Function GetDiskFreeSpaceExAsQWord Lib "kernel32" Alias "GetDiskFreeSpaceExA" (
> ByVal pDirectoryName As *Byte,
> ByRef FreeBytesAvailableToCaller As QWord,
> ByRef TotalNumberOfBytes As QWord,
> ByRef TotalNumberOfFreeBytes As QWord) As Long
>
> Declare Function StrFormatByteSize64 Lib "shlwapi.dll" Alias "StrFormatByteSize64A" (
> value As Int64,
> pszBuf As *Byte,
> uiBufSize As DWord) As *Byte
>
> Function StringFormatByteSize(value As Int64) As String
> Dim buffer[ELM(32)] As Byte
> StrFormatByteSize64(value, buffer, Len(buffer))
> StringFormatByteSize = buffer
> End Function
> それだけでは意味のないプログラムになるので,この例では適当な単位に切り上げた文字列へ変換してくれるStrFormatByteSize64関数(要IE5)と
> それをString型対応させたStrFormatByteSizeを使って,ユーザーが使える空き容量をPrintで表示させています。
Ver 2.62は64ビット整数に対応していません。Ver 4.00以降のバージョンで64ビットに対応するようになりましたので、そちらで試してみてください。
※プログラムの先頭に #prompt もしくは #N88BASIC と記述してください
但し、現状でInt64やQWordを直接PrintするとDouble型として認識されてしまうので、独自の変換関数を使ってやります。
↓こんな感じで使ってください。
※ABのバグのせいか、引数に&H8000000000000000以上の値を指定すると表示がおかしくなります。まさか8EB以上のHDDなんてないはずなので問題ないと思いますが、バグであることに変わりはありませんから報告しておきます。
どうしても2.62でないとダメというのなら、ULARGE_INTEGER用の関数を作れば出来ないこともないでしょうが…。
※イグトランスさん提示のStrFormatByteSize64関数ならば、宣言を少しいじれば2.62でも使えます。
※プログラムの先頭に #prompt もしくは #N88BASIC と記述してください
但し、現状でInt64やQWordを直接PrintするとDouble型として認識されてしまうので、独自の変換関数を使ってやります。
[ここをクリックすると内容が表示されます]
コード: 全て選択
Function Str64(Num As QWord) As String
Dim i As Long,c[20] As Byte
c[20]=0
For i=19 To 0 Step -1
c=(Num Mod 10)+&H30
Num=Num\10
If Num=0 Then Exit For
Next
Str64=MakeStr(c+i)
End Function
↓こんな感じで使ってください。
コード: 全て選択
Print Str64(FreeSpace)
※ABのバグのせいか、引数に&H8000000000000000以上の値を指定すると表示がおかしくなります。まさか8EB以上のHDDなんてないはずなので問題ないと思いますが、バグであることに変わりはありませんから報告しておきます。
どうしても2.62でないとダメというのなら、ULARGE_INTEGER用の関数を作れば出来ないこともないでしょうが…。
※イグトランスさん提示のStrFormatByteSize64関数ならば、宣言を少しいじれば2.62でも使えます。
コード: 全て選択
#include <api_system.sbp>
Declare Function StrFormatByteSize64 Lib "shlwapi.dll" Alias "StrFormatByteSize64A" ( _
ByVal value As Double, _
pszBuf As String, _
ByVal uiBufSize As DWord) As DWord
Function StringFormatByteSize(value As ULARGE_INTEGER) As String
Dim buffer As String, value2 As Double
memcpy(value2, value, 8)
buffer = String$(32, Chr$(0))
StrFormatByteSize64(value2, buffer, 32)
StringFormatByteSize = Left$(buffer, lstrlen(buffer))
End Function
Dim FreeSpace As ULARGE_INTEGER
GetDiskFreeSpaceEx("C:\", FreeSpace, ByVal NULL, ByVal NULL)
Print StringFormatByteSize(FreeSpace)
最後に編集したユーザー hira [ 2006年2月17日(金) 21:10 ], 累計 1 回
[hira]
http://hira.hopto.org/
http://hira.hopto.org/
hiraさんありがとうございました!!
hiraさん、プログラム動きました。
誠にありがとうございます。
すばらしいですね。
これを元に勉強してみます。書き込みありがとうございました。
いとちゃん
誠にありがとうございます。
すばらしいですね。
これを元に勉強してみます。書き込みありがとうございました。
いとちゃん