ドライブ容量取得方法

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: ドライブ容量取得方法

by Mario2 » 2005年8月23日(火) 20:36

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

by イグトランス » 2005年8月23日(火) 19:20

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)

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

by Mario2 » 2005年8月23日(火) 15:16

> もう少し簡単にできると思います。
>
> 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

ありがとうございます。したいことができそうです。
ありがとうございました。

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

by ゲスト » 2005年8月23日(火) 14:50

> 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

ドライブ容量取得方法

by Mario2 » 2005年8月23日(火) 12:47

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
適当に作ったので、上記の形式でなくても良いので、良い方法はありませんでしょうか?

ページトップ