ディスクのフリーエリアを変数に取り込みたい

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
いとちゃん

ディスクのフリーエリアを変数に取り込みたい

#1 投稿記事 by いとちゃん »

たとえばCドライブのフリーエリアを変数で得たいのですが

TYPE 文のオプションで >> を使って TXT に出し

それを、読み込んで数値化する方法以外に、なにか良い方法は

ないでしょうか?

ご存知の方がいらっしゃったらぜひご教示ください。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#2 投稿記事 by イグトランス »

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
空き容量の取得自体はGetDiskFreeSpaceExAsQWordを使用するだけですが,
それだけでは意味のないプログラムになるので,この例では適当な単位に切り上げた文字列へ変換してくれるStrFormatByteSize64関数(要IE5)と
それをString型対応させたStrFormatByteSizeを使って,ユーザーが使える空き容量をPrintで表示させています。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#3 投稿記事 by hira »

実は、わざわざ再度宣言しなくても使う方法はあります(^^;; かなり反則気味ですが。

コード: 全て選択

GetDiskFreeSpaceEx("C:\", ByVal VarPtr(FreeSpace), ByVal 0, ByVal 0)
いとちゃん

いろいろな方法をありがとうございます。

#4 投稿記事 by いとちゃん »

誠に恐れ入りますが、私は本来のN88BASICタイプでActiveBasicを使うことで
非常に利用しています。

ですので、

GetDiskFreeSpaceEx("C:\", ByVal VarPtr(FreeSpace), ByVal 0, ByVal 0)

print FreeSpace

とやってみたのですが、プリントできません。

すみませんが、もう少し先の部分までご教授いただけないでしょうか
いとちゃん

エラー(9行目)と出てしまうのですが・・・

#5 投稿記事 by いとちゃん »

エラーになってしまいますが
バージョンは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
> 空き容量の取得自体はGetDiskFreeSpaceExAsQWordを使用するだけですが,
> それだけでは意味のないプログラムになるので,この例では適当な単位に切り上げた文字列へ変換してくれるStrFormatByteSize64関数(要IE5)と
> それをString型対応させたStrFormatByteSizeを使って,ユーザーが使える空き容量をPrintで表示させています。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#6 投稿記事 by hira »

Ver 2.62は64ビット整数に対応していません。Ver 4.00以降のバージョンで64ビットに対応するようになりましたので、そちらで試してみてください。
※プログラムの先頭に #prompt もしくは #N88BASIC と記述してください

但し、現状でInt64やQWordを直接PrintするとDouble型として認識されてしまうので、独自の変換関数を使ってやります。
↓こんな感じで使ってください。

コード: 全て選択

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さんありがとうございました!!

#7 投稿記事 by いとちゃん »

hiraさん、プログラム動きました。

誠にありがとうございます。

すばらしいですね。

これを元に勉強してみます。書き込みありがとうございました。

いとちゃん
返信する