ドライブ容量取得方法

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

ドライブ容量取得方法

#1 投稿記事 by Mario2 »

GetDiskFreeSpaceEx(GetDiskFreeSpaceでも良いんだけど…)を使ってドライブの(空き)容量を取得、KBやMB、GBに変換して表示させようとしています。

しかし、BからKB(MB)(GB)への計算方法が分からず、悪戦苦闘しています。

以下が、適当に作った容量計算方法です。(一部おかしい所もあるかもしれませんが、気にしないでください(^^;;;)

コード: 全て選択

Sub MainWnd_CommandButton2_Click()
	Dim DSKFRE As ULARGE_INTEGER
	Dim DSKFRE2 As ULARGE_INTEGER
	Dim DSKFRE3 As ULARGE_INTEGER
/*Dim Secs As Dword
Dim SecSize As Dword
Dim FreeClusters As Dword
Dim Clusters As Dword*/
'If GetDiskFreeSpace("C:\",VarPtr(Secs),VarPtr(SecSize),VarPtr(FreeClusters),VarPtr(Clusters))=FALSE THEN MessageBox(0,0,0,0)
If GetDiskFreeSpaceEx("C:\",DSKFRE,DSKFRE2,DSKFRE3)=FALSE Then MessageBox(0,0,0,0)
'MessageBox(0,Str$(DSKFRE.HighPart),Str$(DSKFRE.LowPart),0)
Dim a As Int64
a=DSKFRE3.LowPart
'Dim a As DWord
'a=FreeClusters
If a < 1000 Then 'B
MessageBox(0,Str$(a)+"B",0,0)
ElseIf a < 1000000 Then 'KB
MessageBox(0,Str$(a)+"KB",0,0)
ElseIf a < 1000000000 Then 'MB
/*	Do
If a<1000 Then ExitDO
a=a/1024
	Loop*/
	a=a/1024/1024
MessageBox(0,Str$(a)+"MB",0,0)
ElseIf a < 1000000000000 Then 'GB
/*	Do
MessageBox(0,Str$(a)+"GB",0,0)
If a<1000 Then ExitDO
a=(a/1024/1024)
	Loop*/
	a=a/1024/1024/1024
	a=a*2
	MessageBox(0,Str$(a)+"GB",0,0)
ElseIf a < 1000000000000000 Then 'TB
MessageBox(0,Str$(a)+"TB",0,0)
End If
End Sub
適当に作ったので、上記の形式でなくても良いので、良い方法はありませんでしょうか?
ゲスト

Re: ドライブ容量取得方法

#2 投稿記事 by ゲスト »

> GetDiskFreeSpaceEx(GetDiskFreeSpaceでも良いんだけど…)を使ってドライブの(空き)容量を取得、KBやMB、GBに変換して表示させようとしています。
>
> しかし、BからKB(MB)(GB)への計算方法が分からず、悪戦苦闘しています。
>
> 以下が、適当に作った容量計算方法です。(一部おかしい所もあるかもしれませんが、気にしないでください(^^;;;)
>
>

コード: 全て選択

Sub MainWnd_CommandButton2_Click()
> 	Dim DSKFRE As ULARGE_INTEGER
> 	Dim DSKFRE2 As ULARGE_INTEGER
> 	Dim DSKFRE3 As ULARGE_INTEGER
> /*Dim Secs As Dword
> Dim SecSize As Dword
> Dim FreeClusters As Dword
> Dim Clusters As Dword*/
> 'If GetDiskFreeSpace("C:\",VarPtr(Secs),VarPtr(SecSize),VarPtr(FreeClusters),VarPtr(Clusters))=FALSE THEN MessageBox(0,0,0,0)
> If GetDiskFreeSpaceEx("C:\",DSKFRE,DSKFRE2,DSKFRE3)=FALSE Then MessageBox(0,0,0,0)
> 'MessageBox(0,Str$(DSKFRE.HighPart),Str$(DSKFRE.LowPart),0)
> Dim a As Int64
> a=DSKFRE3.LowPart
> 'Dim a As DWord
> 'a=FreeClusters
> If a < 1000 Then 'B
> MessageBox(0,Str$(a)+"B",0,0)
> ElseIf a < 1000000 Then 'KB
> MessageBox(0,Str$(a)+"KB",0,0)
> ElseIf a < 1000000000 Then 'MB
> /*	Do
> If a<1000 Then ExitDO
> a=a/1024
> 	Loop*/
> 	a=a/1024/1024
> MessageBox(0,Str$(a)+"MB",0,0)
> ElseIf a < 1000000000000 Then 'GB
> /*	Do
> MessageBox(0,Str$(a)+"GB",0,0)
> If a<1000 Then ExitDO
> a=(a/1024/1024)
> 	Loop*/
> 	a=a/1024/1024/1024
> 	a=a*2
> 	MessageBox(0,Str$(a)+"GB",0,0)
> ElseIf a < 1000000000000000 Then 'TB
> MessageBox(0,Str$(a)+"TB",0,0)
> End If
> End Sub
> 
>
> 適当に作ったので、上記の形式でなくても良いので、良い方法はありませんでしょうか?
もう少し簡単にできると思います。

Sub MainWnd_CommandButton2_Click()
Dim DSKFRE As QWord
Dim DSKFRE2 As QWord
Dim DSKFRE3 As QWord
GetDiskFreeSpaceEx("C:\",ByVal VarPtr(DSKFRE),ByVal VarPtr(DSKFRE2),ByVal VarPtr(DSKFRE3))
MessageBox(0,Str$(DSKFRE3)+"B","ドライブ空き容量",0)
MessageBox(0,Str$(DSKFRE3/1024)+"KB","ドライブ空き容量",0)
MessageBox(0,Str$(DSKFRE3/1024/1024)+"MB","ドライブ空き容量",0)
MessageBox(0,Str$(DSKFRE3/1024/1024/1024)+"GB","ドライブ空き容量",0)
MessageBox(0,Str$(DSKFRE3/1024/1024/1024/1024)+"TB","ドライブ空き容量",0)
End Sub
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

Re: ドライブ容量取得方法

#3 投稿記事 by Mario2 »

> もう少し簡単にできると思います。
>
> Sub MainWnd_CommandButton2_Click()
> Dim DSKFRE As QWord
> Dim DSKFRE2 As QWord
> Dim DSKFRE3 As QWord
> GetDiskFreeSpaceEx("C:\",ByVal VarPtr(DSKFRE),ByVal VarPtr(DSKFRE2),ByVal VarPtr(DSKFRE3))
> MessageBox(0,Str$(DSKFRE3)+"B","ドライブ空き容量",0)
> MessageBox(0,Str$(DSKFRE3/1024)+"KB","ドライブ空き容量",0)
> MessageBox(0,Str$(DSKFRE3/1024/1024)+"MB","ドライブ空き容量",0)
> MessageBox(0,Str$(DSKFRE3/1024/1024/1024)+"GB","ドライブ空き容量",0)
> MessageBox(0,Str$(DSKFRE3/1024/1024/1024/1024)+"TB","ドライブ空き容量",0)
> End Sub

ありがとうございます。したいことができそうです。
ありがとうございました。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

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

SHLWAPI.DLLにはある関数も楽できます。

StrFormatKBSizeは数値を常にKB表記の文字列に変換する関数です。
StrFormatByteSize64はBytesからEBまで適切な単位をつけた文字列に変換してくれます。(つまりこちらが単位を選ぶことはできません)

こんな宣言です。

コード: 全て選択

TypeDef UINT = DWord

Declare Function StrFormatKBSize Lib "shlwapi" Alias "StrFormatKBSizeA" (
	ByVal Value As Int64,
	ByVal pszBuf As BytePtr,
	ByVal uiBuSize As UINT) As BytePtr

Declare Function StrFormatByteSize64 Lib "shlwapi" Alias "StrFormatByteSize64A" (
	ByVal Value As Int64,
	ByVal pszBuf As BytePtr,
	ByVal uiBuSize As UINT) As BytePtr
こんな感じに使えます。楽するためにラッピングしていますが。

コード: 全て選択

#strict
TypeDef StrFormatFunc = *Function(Value As Int64, psz As BytePtr, cch As UINT) As BytePtr

Function StringFormatKBSize(Value As Int64) As String
	Dim Buf[63] As Byte
	StrFormatKBSize(Value, Buf, Len(Buf))
	StringFormatKBSize = MakeStr(Buf)
End Function

Function StringFormatByteSize64(Value As Int64) As String
	Dim Buf[63] As Byte
	StrFormatByteSize64(Value, Buf, Len(Buf))
	StringFormatByteSize64 = MakeStr(Buf)
End Function

Dim FreeBytes As QWord, TotalBytes As QWord
GetDiskFreeSpaceEx("C:\", ByVal VarPtr(FreeBytes), ByVal VarPtr(TotalBytes), ByVal NULL)
Dim strKB As String, strByteSize As String
strKB = "空き: " + StringFormatKBSize(FreeBytes) + ", 総量: " + StringFormatKBSize(TotalBytes)
strByteSize = "空き: " + StringFormatByteSize64(FreeBytes) + ", 総量: " + StringFormatByteSize64(TotalBytes)
MessageBox(0, strKB, strByteSize, MB_OK)
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

#5 投稿記事 by Mario2 »

イグトランスさん、ありがとうございます。
こちらも参考にさせていただきます。
返信する