ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月25日(木) 08:14

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 7 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2006年2月13日(月) 12:11 
たとえばCドライブのフリーエリアを変数で得たいのですが

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

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

ないでしょうか?

ご存知の方がいらっしゃったらぜひご教示ください。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2006年2月13日(月) 17:32 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
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で表示させています。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年2月13日(月) 22:43 
オフライン

登録日時: 2005年5月31日(火) 20:14
記事: 203
お住まい: 兵庫県
実は、わざわざ再度宣言しなくても使う方法はあります(^^;; かなり反則気味ですが。
コード:
GetDiskFreeSpaceEx("C:\", ByVal VarPtr(FreeSpace), ByVal 0, ByVal 0)

_________________
[hira]
http://hira.hopto.org/


通報する
ページトップ
投稿記事Posted: 2006年2月17日(金) 18:07 
誠に恐れ入りますが、私は本来のN88BASICタイプでActiveBasicを使うことで
非常に利用しています。

ですので、

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

print FreeSpace

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

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


通報する
ページトップ
   
投稿記事Posted: 2006年2月17日(金) 18:34 
エラーになってしまいますが
バージョンは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で表示させています。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2006年2月17日(金) 20:40 
オフライン

登録日時: 2005年5月31日(火) 20:14
記事: 203
お住まい: 兵庫県
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]
http://hira.hopto.org/


最後に編集したユーザー hira [ 2006年2月17日(金) 21:10 ], 累計 1 回

通報する
ページトップ
投稿記事Posted: 2006年2月27日(月) 15:15 
hiraさん、プログラム動きました。

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

すばらしいですね。

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

いとちゃん


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 7 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[16人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean