Что делает флаг FFFS_SHOWBYTESINDEX в функции FSF.FormatFileSize?

Место, где разработчики плагинов могут поделиться своим опытом.
Post Reply
iggy
Posts: 14
Joined: Thu 01 May, 2025 20:14
Has thanked: 4 times

Что делает флаг FFFS_SHOWBYTESINDEX в функции FSF.FormatFileSize?

Post by iggy »

Что реально делает флаг FFFS_SHOWBYTESINDEX?

В энциклопедии написано:
Добавлять суффиксы: B - для байт, K - килобайт, M - мегабайт, G - гигабайт, T - терабайт, P - петабайт, E - эксабайт
Рассчитывая на это, делаю так:
static wchar_t formattedSize[64];
size_t result = FSF.FormatFileSize(panel->FreeSize, 0, FFFS_FLOATSIZE | FFFS_SHOWBYTESINDEX, formattedSize, sizeof(formattedSize) / sizeof(wchar_t));
Для примера: FreeSize = 62 618 095 616. Ожидаю, что получу "58,3 ГБ", а получаю "58,3 Г" (в английском интерфейсе аналогично, получаю "58,3 G" вместо "58,3 GB" ). Точно такой же эффект, как если указать только флаг FFFS_FLOATSIZE.

FFFS_SHOWBYTESINDEX на что-то иное влияет? Или что-то не работает? Проверял на билдах 6446, 5955 и 5342, более ранних не нашел.
User avatar
John Doe
Бюрократ
Posts: 14267
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 80 times
Been thanked: 468 times
Contact:

Что делает флаг FFFS_SHOWBYTESINDEX в функции FSF.FormatFileSize?

Post by John Doe »

iggy wrote: Fri 09 May, 2025 00:11 FFFS_SHOWBYTESINDEX на что-то иное влияет?
Вероятно при FFFS_FLOATSIZE этот флаг неявно уже подразумевается.

...влияет только если значение выражено в байтах.
Last edited by John Doe on Fri 09 May, 2025 01:22, edited 1 time in total.
https://t.me/FarManager — Telegram чат
iggy
Posts: 14
Joined: Thu 01 May, 2025 20:14
Has thanked: 4 times

Что делает флаг FFFS_SHOWBYTESINDEX в функции FSF.FormatFileSize?

Post by iggy »

влияет только если значение выражено в байтах
Видимо, так, да.

Я, конечно, добавил костыль: если последняя буква получившейся строки с размером - английская, то добавляю 'B', а если русская - добавляю 'Б'. Но это так себе решение, костыль есть костыль.

Но как фар получает суффиксы именно "GB" и "ГБ"? Разве не та же функция внутри фара используется?
2useven10
Posts: 5342
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 20 times
Been thanked: 336 times

Что делает флаг FFFS_SHOWBYTESINDEX в функции FSF.FormatFileSize?

Post by 2useven10 »

Code: Select all

static void format_space(wchar_t *buf, size_t bsz, ULONG64 space, bool show_bytes)
{
	if (show_bytes) {
		_FSF.FormatFileSize(space, 0, FFFS_COMMAS, buf, bsz);
	}
	else {
		_FSF.FormatFileSize(1, 0, FFFS_FLOATSIZE | FFFS_SHOWBYTESINDEX, buf, bsz);
		auto byte_suffix = buf[0] ? buf[wcslen(buf) - 1] : L'\0';
		_FSF.FormatFileSize(space, 0, FFFS_FLOATSIZE | FFFS_SHOWBYTESINDEX, buf, bsz);
		auto len = wcslen(buf);
		if (len > 0 && buf[len - 1] != byte_suffix) {
			buf[len] = byte_suffix;
			buf[len + 1] = L'\0';
		}
	}
}
iggy
Posts: 14
Joined: Thu 01 May, 2025 20:14
Has thanked: 4 times

Что делает флаг FFFS_SHOWBYTESINDEX в функции FSF.FormatFileSize?

Post by iggy »

Интересное решение, спасибо) Возьму на вооружение.

Хотя всё равно странно, что нет флага, выполняющего это штатно. Все плагины вынуждены что-то подобное в код встраивать, чтобы получить такое, в принципе, стандартное поведение.
Post Reply

Return to “Разработка плагинов”