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.