ページ 1 / 1
ドライブ容量取得方法
Posted: 2005年8月23日(火) 12:47
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: ドライブ容量取得方法
Posted: 2005年8月23日(火) 14:50
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
Re: ドライブ容量取得方法
Posted: 2005年8月23日(火) 15:16
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
ありがとうございます。したいことができそうです。
ありがとうございました。
Posted: 2005年8月23日(火) 19:20
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)
Posted: 2005年8月23日(火) 20:36
by Mario2
イグトランスさん、ありがとうございます。
こちらも参考にさせていただきます。