из прошлого багоотчета пришел к выводу, что чинят FAR довольно долго.
Меня давно мазолил поломанный пункт [x] Сохранить временные метки (PreserveTimeStamp).
Точнее пункт работает в F5 (copy), но не в F6 (move), из-за этого иногда "боялся" нажимать F6, лучше F5 и вручную удалить...
Флажок PreserveTimeStamps завезли с v5509 (19г.), с тех пор нет подвижек с закрытием бага. Не стал писать баготчет, так как понимал, что никому нет дела до этого (предыдущий баготчет был "проигнорирован", возможно "не в приоритете")
В общем, решил сам покопаться, скачал исходники с репизитории... и ошамлел увидев ВСЮ КУХНЮ КОД (у меня другое представление о сжатии кода, а тут будто бесконечные просторы: одна строка - одна скобка).. но я не программист, если что.. вот мои правки в двух местах:
// сохраним выделение
SrcPanel->SaveSelection();
strDestFSName.clear();
int OldCopySymlinkContents=Flags&FCOPY_COPYSYMLINKCONTENTS;
// собственно - один проход копирования
// Mantis#45: Необходимо привести копирование ссылок на папки с NTFS на FAT к более логичному виду
{
DWORD FilesystemFlags;
if (os::fs::GetVolumeInformation(GetPathRoot(strNameTmp), nullptr, nullptr, nullptr, &FilesystemFlags, nullptr) && !(FilesystemFlags&FILE_SUPPORTS_REPARSE_POINTS))
Flags|=FCOPY_COPYSYMLINKCONTENTS;
}
NeedDizUpdate = true;
CopyFileTree(strNameTmp);
//============ Восстановить TimeStamp для корневых папок после "переноса" (F6-Move) ===============
if ((Flags & FCOPY_MOVE) && Global->Opt->CMOpt.PreserveTimestamps) // fix для MOVE
{
for (const auto& SelectedItem : SrcPanel->enum_selected()) // помеченый?
{
if (SelectedItem.Attributes & FILE_ATTRIBUTE_DIRECTORY) // папка?
{
string strDestFolder = strNameTmp; // путь\ (с слэшем)
if (!IsSlash(strDestFolder.back()))
AddEndSlash(strDestFolder);
strDestFolder += PointToName(SelectedItem.FileName);
os::fs::file DestFile;
if (DestFile.Open(strDestFolder, FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT))
{
set_file_time(DestFile, SelectedItem);
DestFile.Close();
}
}
}
}
//=======================
if (OldCopySymlinkContents)
Flags|=FCOPY_COPYSYMLINKCONTENTS;
else
Flags&=~FCOPY_COPYSYMLINKCONTENTS;
// если "есть порох в пороховницах" - восстановим выделение
if (!LastIteration)
SrcPanel->RestoreSelection();
// Позаботимся о дизах.
if (!(Flags&FCOPY_COPYTONUL) && !strDestDizPath.empty())
{
// Скидываем только во время последней Op.
if (LastIteration && Move && !os::fs::file_status(DestDiz.GetDizName()).check(FILE_ATTRIBUTE_READONLY))
SrcPanel->FlushDiz();
DestDiz.Flush(strDestDizPath);
}