Delphi 东京 Android:如何获得免费可用磁盘 Space?
Delphi Tokyo Android: How do I get the Free Available Disk Space?
我找到了这个信息 here,但我似乎无法在我的应用程序中使用它。
尝试使用 TJMtpStorageInfo.JavaClass.getFreeSpace 访问它;但这似乎不起作用。
找到另一个 link ,但它们不包括 TJALStatFs 的来源或 uses 子句。 TJALStatFs 未定义。
我只是想解决这个问题。是否有人可以提供 Delphi 东京 Android 编程的源代码,以便我可以在 Android 设备上免费获得可用的 space?
我正在调试 Moto G4 Play Android 版本 6.0.1
Delphi 东京 10.2.2 版本 w/ Android 6.0.1:
找到这个 link android.os.StatFs,我需要将其包含到我的项目中。
我设计的简单程序会用随机数据填充 android 上的所有 space。
这是我用来做这个的源代码。警告:代码可能仍然有问题,但目前似乎正在做它应该做的事情。这里的主要 objective 是展示我让它工作的完整源代码。我个人讨厌别人只提供部分源代码,而你必须弄清楚其余所有代码。
Thread 不喜欢更新记事本或任何 GUI.. 所以我将它们注释掉了。我必须创建一个特殊的 TThread 烦人过程,但目前我只是为了让应用程序运行。编码有点草率,请见谅
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
IdBaseComponent, IdThreadComponent, FMX.StdCtrls, FMX.Layouts,
FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, System.IOUtils,
AndroidAPI.JNIBridge,
Androidapi.JNI.JavaTypes,
android.os.StatFs,
Posix.Unistd;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Layout1: TLayout;
AniIndicator1: TAniIndicator;
Layout2: TLayout;
STOP: TButton;
Layout3: TLayout;
Label1: TLabel;
IdThreadComponent1: TIdThreadComponent;
Button2: TButton;
procedure IdThreadComponent1Run(Sender: TIdThreadComponent);
procedure Button1Click(Sender: TObject);
procedure STOPClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure IdThreadComponent1Stopped(Sender: TIdThreadComponent);
procedure IdThreadComponent1Terminate(Sender: TIdThreadComponent);
private
{ Private declarations }
public
{ Public declarations }
breakit: boolean;
//createnewrandfileActive: boolean;
copydataActive: boolean;
procedure CopyData();
procedure CreateNewRandFile(Fsize : Int64);
function CheckDiskSize(aDir : String): Int64;
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
uses Androidapi.Helpers;
procedure TForm1.Button1Click(Sender: TObject);
begin
breakit := false;
IdThreadComponent1.Start;
end;
function TForm1.CheckDiskSize(aDir : String): Int64;
var aStatFS : JStatFs;
//aTmpAvailableSpace : Int64;
begin
aStatFS := TJStatFs.JavaClass.init(StringToJString(aDir));
//aTmpAvailableSpace := aStatFS.getBlockSize * aStatFS.getAvailableBlocks;
//aTmpAvailableSpace := aStatFS.getAvailableBytes;
//aStatFS := nil;
result := aStatFS.getAvailableBytes;
end;
procedure TForm1.CreateNewRandFile(Fsize : Int64);
var
FileStream1: TFileStream;
RandomFileToCopy : string;
Rand1 : Int64;
begin
//createnewrandfileActive := true;
//memo1.BeginUpdate;
//memo1.Lines.Add('Begin CreateNewRandFile');
//memo1.EndUpdate;
// create random file
if Fsize > CheckDiskSize(TPath.GetTempPath) then Fsize := CheckDiskSize(TPath.GetTempPath);
//memo1.lines.add('free space: ' + IntToStr(CheckDiskSize((TPath.GetTempPath))));
//memo1.lines.add('create file size: ' + IntToStr(Fsize));
Randomize;
RandomFileToCopy := TPath.GetTempPath + TPath.DirectorySeparatorChar + 'random.fil';
//memo1.Lines.Add(RandomFileToCopy);
if FileExists(RandomFileToCopy) = false then
begin
FileStream1 := TFileStream.Create(RandomFileToCopy, fmCreate or fmOpenWrite or fmShareDenyWrite);
try
while FileStream1.Size < Fsize do
begin
Rand1 := Random(2147483600);
FileStream1.WriteBuffer(Rand1, SizeOf(Rand1));
//Label1.Text := IntToStr(FileStream1.Size);
if breakit = true then break;
end;
finally
FileStream1.Free;
end;
end;
//memo1.lines.add('free space ' + IntToStr(CheckDiskSize(TPath.GetTempPath)));
//memo1.BeginUpdate;
//memo1.Lines.Add('End of CreateNewRandFile');
// memo1.EndUpdate;
//createnewrandfileActive := false;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
CreateNewRandFile(128000000); // create a 128mb file
end;
procedure TForm1.CopyData();
var
DriveStr : String;
RandomFileToCopy : String;
FileNameCounter : integer;
FolderCounter : integer;
FolderName : string;
FolderArea : string;
RandomFileName : String;
begin
copydataActive := true;
breakit := false;
FileNameCounter := 0;
FolderCounter := 0;
//memo1.BeginUpdate;
//memo1.Lines.Add('Begin of Copy');
//memo1.EndUpdate;
DriveStr := TPath.GetTempPath() + TPath.DirectorySeparatorChar;
//memo1.Lines.Add('DriveStr ' + DriveStr);
RandomFileToCopy := DriveStr + 'random.fil';
//memo1.Lines.Add('RandomFileToCopy ' + RandomFileToCopy);
//memo1.Lines.Add('Creating Random File...');
// create random file
CreateNewRandFile(64000000); //64 mb file
inc(FolderCounter);
FolderName := 'rand' + IntToStr(FolderCounter);
//memo1.Lines.Add('FolderName ' + FolderName);
FolderArea := TPath.GetTempPath() + TPath.DirectorySeparatorChar + FolderName;
//memo1.Lines.Add('FolderArea ' + FolderArea);
while DirectoryExists(FolderArea) = true do
begin
inc(FolderCounter);
FolderName := 'rand' + IntToStr(FolderCounter);
FolderArea := TPath.GetTempPath() + TPath.DirectorySeparatorChar + FolderName;
if breakit = true then break;
end;
TDirectory.CreateDirectory(FolderArea);
while CheckDiskSize(FolderArea) > 0 do
begin
if breakit = true then break;
//memo1.Lines.Add('CreateDir(FolderName) ' + FolderName);
//FolderArea := FolderArea + TPath.DirectorySeparatorChar;
//memo1.Lines.Add('FolderArea ' + FolderArea);
RandomFileName := FolderArea + 'ran' + IntToStr(FileNameCounter) + '.fil';
//memo1.Lines.Add('RandomFileName ' + RandomFileName);
FileNameCounter := 0;
while FileNameCounter<126 do
begin
inc(FileNameCounter);
//while FileExists(RandomFileName) do
//begin
RandomFileName := FolderArea + TPath.DirectorySeparatorChar + 'ran' + IntToStr(FileNameCounter) + '.fil';
//end;
//memo1.Lines.Add(RandomFileName);
//Label1.Text := RandomFileName;
try
//if FileExists(RandomFileName) = true then DeleteFile(RandomFileName);
TFile.Copy(RandomFileToCopy, RandomFileName);
Except
On E: Exception Do
begin
//memo1.BeginUpdate;
showmessage(E.ClassName + ' ERROR: ' + E.Message);
//memo1.EndUpdate;
breakit := true;
end;
end;
if breakit = true then break;
end;
while DirectoryExists(FolderArea) = true do
begin
inc(FolderCounter);
FolderName := 'rand' + IntToStr(FolderCounter);
FolderArea := TPath.GetTempPath() + TPath.DirectorySeparatorChar + FolderName;
if breakit = true then break;
end;
TDirectory.CreateDirectory(FolderArea);
end;
//memo1.BeginUpdate;
//memo1.Lines.Add('End of Copy');
//memo1.EndUpdate;
//memo1.Lines.Add('Deleting Created Fillers');
copydataActive := false;
end;
procedure TForm1.IdThreadComponent1Run(Sender: TIdThreadComponent);
begin
if breakit = true then
begin
IdThreadComponent1.Stop;
exit;
end;
if copydataActive = false then
begin
AniIndicator1.Enabled := true;
CopyData();
end;
sleep(500);
end;
procedure TForm1.IdThreadComponent1Stopped(Sender: TIdThreadComponent);
begin
AniIndicator1.Enabled := false;
end;
procedure TForm1.IdThreadComponent1Terminate(Sender: TIdThreadComponent);
begin
AniIndicator1.Enabled := false;
end;
procedure TForm1.STOPClick(Sender: TObject);
begin
breakit := true;
IdThreadComponent1.Stop;
end;
end.
我找到了这个信息 here,但我似乎无法在我的应用程序中使用它。
尝试使用 TJMtpStorageInfo.JavaClass.getFreeSpace 访问它;但这似乎不起作用。
找到另一个 link
我只是想解决这个问题。是否有人可以提供 Delphi 东京 Android 编程的源代码,以便我可以在 Android 设备上免费获得可用的 space?
我正在调试 Moto G4 Play Android 版本 6.0.1
Delphi 东京 10.2.2 版本 w/ Android 6.0.1:
找到这个 link android.os.StatFs,我需要将其包含到我的项目中。
我设计的简单程序会用随机数据填充 android 上的所有 space。
这是我用来做这个的源代码。警告:代码可能仍然有问题,但目前似乎正在做它应该做的事情。这里的主要 objective 是展示我让它工作的完整源代码。我个人讨厌别人只提供部分源代码,而你必须弄清楚其余所有代码。
Thread 不喜欢更新记事本或任何 GUI.. 所以我将它们注释掉了。我必须创建一个特殊的 TThread 烦人过程,但目前我只是为了让应用程序运行。编码有点草率,请见谅
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
IdBaseComponent, IdThreadComponent, FMX.StdCtrls, FMX.Layouts,
FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, System.IOUtils,
AndroidAPI.JNIBridge,
Androidapi.JNI.JavaTypes,
android.os.StatFs,
Posix.Unistd;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Layout1: TLayout;
AniIndicator1: TAniIndicator;
Layout2: TLayout;
STOP: TButton;
Layout3: TLayout;
Label1: TLabel;
IdThreadComponent1: TIdThreadComponent;
Button2: TButton;
procedure IdThreadComponent1Run(Sender: TIdThreadComponent);
procedure Button1Click(Sender: TObject);
procedure STOPClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure IdThreadComponent1Stopped(Sender: TIdThreadComponent);
procedure IdThreadComponent1Terminate(Sender: TIdThreadComponent);
private
{ Private declarations }
public
{ Public declarations }
breakit: boolean;
//createnewrandfileActive: boolean;
copydataActive: boolean;
procedure CopyData();
procedure CreateNewRandFile(Fsize : Int64);
function CheckDiskSize(aDir : String): Int64;
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
uses Androidapi.Helpers;
procedure TForm1.Button1Click(Sender: TObject);
begin
breakit := false;
IdThreadComponent1.Start;
end;
function TForm1.CheckDiskSize(aDir : String): Int64;
var aStatFS : JStatFs;
//aTmpAvailableSpace : Int64;
begin
aStatFS := TJStatFs.JavaClass.init(StringToJString(aDir));
//aTmpAvailableSpace := aStatFS.getBlockSize * aStatFS.getAvailableBlocks;
//aTmpAvailableSpace := aStatFS.getAvailableBytes;
//aStatFS := nil;
result := aStatFS.getAvailableBytes;
end;
procedure TForm1.CreateNewRandFile(Fsize : Int64);
var
FileStream1: TFileStream;
RandomFileToCopy : string;
Rand1 : Int64;
begin
//createnewrandfileActive := true;
//memo1.BeginUpdate;
//memo1.Lines.Add('Begin CreateNewRandFile');
//memo1.EndUpdate;
// create random file
if Fsize > CheckDiskSize(TPath.GetTempPath) then Fsize := CheckDiskSize(TPath.GetTempPath);
//memo1.lines.add('free space: ' + IntToStr(CheckDiskSize((TPath.GetTempPath))));
//memo1.lines.add('create file size: ' + IntToStr(Fsize));
Randomize;
RandomFileToCopy := TPath.GetTempPath + TPath.DirectorySeparatorChar + 'random.fil';
//memo1.Lines.Add(RandomFileToCopy);
if FileExists(RandomFileToCopy) = false then
begin
FileStream1 := TFileStream.Create(RandomFileToCopy, fmCreate or fmOpenWrite or fmShareDenyWrite);
try
while FileStream1.Size < Fsize do
begin
Rand1 := Random(2147483600);
FileStream1.WriteBuffer(Rand1, SizeOf(Rand1));
//Label1.Text := IntToStr(FileStream1.Size);
if breakit = true then break;
end;
finally
FileStream1.Free;
end;
end;
//memo1.lines.add('free space ' + IntToStr(CheckDiskSize(TPath.GetTempPath)));
//memo1.BeginUpdate;
//memo1.Lines.Add('End of CreateNewRandFile');
// memo1.EndUpdate;
//createnewrandfileActive := false;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
CreateNewRandFile(128000000); // create a 128mb file
end;
procedure TForm1.CopyData();
var
DriveStr : String;
RandomFileToCopy : String;
FileNameCounter : integer;
FolderCounter : integer;
FolderName : string;
FolderArea : string;
RandomFileName : String;
begin
copydataActive := true;
breakit := false;
FileNameCounter := 0;
FolderCounter := 0;
//memo1.BeginUpdate;
//memo1.Lines.Add('Begin of Copy');
//memo1.EndUpdate;
DriveStr := TPath.GetTempPath() + TPath.DirectorySeparatorChar;
//memo1.Lines.Add('DriveStr ' + DriveStr);
RandomFileToCopy := DriveStr + 'random.fil';
//memo1.Lines.Add('RandomFileToCopy ' + RandomFileToCopy);
//memo1.Lines.Add('Creating Random File...');
// create random file
CreateNewRandFile(64000000); //64 mb file
inc(FolderCounter);
FolderName := 'rand' + IntToStr(FolderCounter);
//memo1.Lines.Add('FolderName ' + FolderName);
FolderArea := TPath.GetTempPath() + TPath.DirectorySeparatorChar + FolderName;
//memo1.Lines.Add('FolderArea ' + FolderArea);
while DirectoryExists(FolderArea) = true do
begin
inc(FolderCounter);
FolderName := 'rand' + IntToStr(FolderCounter);
FolderArea := TPath.GetTempPath() + TPath.DirectorySeparatorChar + FolderName;
if breakit = true then break;
end;
TDirectory.CreateDirectory(FolderArea);
while CheckDiskSize(FolderArea) > 0 do
begin
if breakit = true then break;
//memo1.Lines.Add('CreateDir(FolderName) ' + FolderName);
//FolderArea := FolderArea + TPath.DirectorySeparatorChar;
//memo1.Lines.Add('FolderArea ' + FolderArea);
RandomFileName := FolderArea + 'ran' + IntToStr(FileNameCounter) + '.fil';
//memo1.Lines.Add('RandomFileName ' + RandomFileName);
FileNameCounter := 0;
while FileNameCounter<126 do
begin
inc(FileNameCounter);
//while FileExists(RandomFileName) do
//begin
RandomFileName := FolderArea + TPath.DirectorySeparatorChar + 'ran' + IntToStr(FileNameCounter) + '.fil';
//end;
//memo1.Lines.Add(RandomFileName);
//Label1.Text := RandomFileName;
try
//if FileExists(RandomFileName) = true then DeleteFile(RandomFileName);
TFile.Copy(RandomFileToCopy, RandomFileName);
Except
On E: Exception Do
begin
//memo1.BeginUpdate;
showmessage(E.ClassName + ' ERROR: ' + E.Message);
//memo1.EndUpdate;
breakit := true;
end;
end;
if breakit = true then break;
end;
while DirectoryExists(FolderArea) = true do
begin
inc(FolderCounter);
FolderName := 'rand' + IntToStr(FolderCounter);
FolderArea := TPath.GetTempPath() + TPath.DirectorySeparatorChar + FolderName;
if breakit = true then break;
end;
TDirectory.CreateDirectory(FolderArea);
end;
//memo1.BeginUpdate;
//memo1.Lines.Add('End of Copy');
//memo1.EndUpdate;
//memo1.Lines.Add('Deleting Created Fillers');
copydataActive := false;
end;
procedure TForm1.IdThreadComponent1Run(Sender: TIdThreadComponent);
begin
if breakit = true then
begin
IdThreadComponent1.Stop;
exit;
end;
if copydataActive = false then
begin
AniIndicator1.Enabled := true;
CopyData();
end;
sleep(500);
end;
procedure TForm1.IdThreadComponent1Stopped(Sender: TIdThreadComponent);
begin
AniIndicator1.Enabled := false;
end;
procedure TForm1.IdThreadComponent1Terminate(Sender: TIdThreadComponent);
begin
AniIndicator1.Enabled := false;
end;
procedure TForm1.STOPClick(Sender: TObject);
begin
breakit := true;
IdThreadComponent1.Stop;
end;
end.