Topic "Human-readable file size?"

Author Message
Guest




I think this question may be asked before. I did some search, but didn't get answer. Does WinSCP have human-readable file size scaling as commonly seen as the -h switch in ls and du commands? For example, 2500 bytes -> 2.4 KB, 1234567 bytes -> 1.2 MB. FileZilla seems have such an option, but I like WinSCP better. Very Happy
Advertisements
martin
[View user's profile]
Site Admin
Joined: 2002-12-10
Posts: 24991
Location: Prague, Czechia
WinSCP shows human readable size on file properties dialog. I suppose you want it on file panel?
_________________
Martin Prikryl
Guest




Yes, or more precisely in the explorer panel, like Windows Explorer and many other similar applications do. It is annoying to right-click -> left-click on more than 100 files, isn't it? I suppose it is not that difficult to implement, but quit useful for users.

P.S. In my WinSCP, I don't have the "Calculate" button as shown in the screenshot. Is it only available in certain cases?

Thanks for reply!
martin
[View user's profile]
Site Admin
Joined: 2002-12-10
Posts: 24991
Location: Prague, Czechia
This request has been added to tracker.
_________________
Martin Prikryl
TomR
[View user's profile]

Joined: 2009-11-01
Posts: 1
Location: NYC
I was taking a look at this bug, I made some progress on it.

In UnixDirView.cpp first I added a function to display filesizes in a human readable format:

Code:
AnsiString TUnixDirView::FormatFileSize(__int64 size)
{
  const __int64 B  = 1;
  const __int64 KB = 1024 * B;
  const __int64 MB = 1024 * KB;
  const __int64 GB = 1024 * MB;

  if(size > GB)
    return FormatFloat("0.## GB", size / GB);
  else if(size > MB)
    return FormatFloat("0.## MB", size / MB);
  else if(size > KB)
    return FormatFloat("0.## KB", size / KB);
  else
   return FormatFloat("0.## b", size);
}


Then I changed TUnixDirView::GetDisplayInfo

Code:
case uvSize:
  // expanded from ?: to avoid memory leaks
  if (!File->IsDirectory)
  {
   Value = FormatFileSize(File->Size);
  }
  break;



But this only affects the remote pane not the local pane. I couldn't for the life of me find where that was happening.

Later on, I found the FormatBytes function in GUITools.cpp. If you add a reference to GUITools.h at the top of UnixDirView.cpp, you can use that function and ignore mine completely:

Code:
case uvSize:
  // expanded from ?: to avoid memory leaks
  if (!File->IsDirectory)
  {
   Value = FormatBytes(File->Size);
  }
  break;


I kept looking and I eventually found that the display for the local pane was governed by a Pascal Function FormatSize in BaseUtils.pas. I edited those two functions to format the size in the same manner as FormatBytes.

Code:
function FormatSize(Size: Cardinal): string;
var
  i: Integer;
  p: Integer;
  suffix: string;
begin
  p := 0;
  i := 3;
 
  if Size < (100*1024) then begin {b}
   suffix := ' B';
  end else if Size < (100*1024*1024) then begin {KB}
   Size := Cardinal(Round(Size / 1024));
   suffix := ' KiB';
  end else begin {MB}
   Size := Cardinal(Round(Size / (1024 * 1024)));
   suffix := ' MiB';
  end;
 
  Result := IntToStr(Size);
  while i + p < Length(Result) do
  begin
    Insert(ThousandSeparator, Result, Length(Result) - (i + p)+ 1);
    Inc(p);
    INC(i, 3);
  end;
  Insert(Suffix, Result, Length(Result) + 1)
end; {FormatSize}

function FormatSize(Size: Int64): String;
var
  i: Integer;
  p: Integer;
  suffix: string;
begin
  p := 0;
  i := 3;
 
  if Size < (100*1024) then begin {b}
   suffix := ' B';
  end else if Size < (100*1024*1024) then begin {KB}
   Size := Round(Size / 1024);
   suffix := ' KiB';
  end else begin {MB}
   Size := Round(Size / (1024 * 1024));
   suffix := ' MiB';
  end;

  Result := IntToStr(Size);
  while i + p < Length(Result) do
  begin
    Insert(ThousandSeparator, Result, Length(Result) - (i + p)+ 1);
    Inc(p);
    Inc(i, 3);
  end;
 
  Insert(Suffix, Result, Length(Result) + 1)
 
end; {FormatSize}



Searching for "#,##0" brings up some other locations where the filesize should probably be edited. But when I edited those, I didn't see any change, so since I can't test that code, I left it alone.



I hope this helps - I decided I needed to kick myself and contribute something to Open Source.
martin
[View user's profile]
Site Admin
Joined: 2002-12-10
Posts: 24991
Location: Prague, Czechia
Thanks Tom. I have raised priority for this.
_________________
Martin Prikryl
pandaking
[View user's profile]

Joined: 2010-04-22
Posts: 1
+1

I'd much rather in my file list it showed "KB", "MB", "GB" etc. than the current system.
Any news on adding this feature?
mattcredp

Guest


has this functionality been added? I can't find the option on my install (4.3.3 build1340)
Advertisements

You can post new topics in this forum






Search Site

What is WinSCP?

It is award-winning SFTP client, SCP client, FTPS client and FTP client integrated into one software program for file transfer to FTP server or secure SFTP server. [More]

And it's free!

Donate

About donations

$9   $19   $49   $99

About donations

Recommend

WinSCP Privacy Policy

WinSCP License