Я хочу найти файлы в папке и проверить, сколько им лет.
У меня есть этот фрагмент кода, который не работает так, как я ожидаю, согласно документации и примерам, которым я следовал:
const QDate today = QDate::currentDate();
Q_FOREACH(auto fileInfo, QDir("folderName").entryInfoList(QDir::Files)) {
// These variables are added to the watch table to see their values
auto test1 = fileInfo.created().date().daysTo(today);
auto test2 = fileInfo.baseName();
auto test3 = fileInfo.suffix();
}
Я добавляю переменные test1, test2, test3 в таблицу наблюдения, чтобы посмотреть, какие у них значения.
Мне кажется, что daysTo(today)
возвращает 0
, потому что today
— недопустимый формат. Это в юлианский день. Но он имеет тип QDate
, а QDate::daysTo(QDate d)
требует переменную типа QDate
в качестве параметра. Мне это кажется правильным?
И правильные файлы также находятся, сверившись с базовым именем и суффиксом. И им не 0 дней... Скорее месяц или около того.
Почему daysTo
возвращается 0
, хотя вроде бы все в порядке?
Я использую QT 5.15.2.
Обновление: я добавил еще несколько тестов и изменил функцию create() наbirthTime(). См. комментарии к результатам, которые я нахожу при просмотре переменных в таблице наблюдения:
const QDate today = QDate::currentDate();
Q_FOREACH(auto fileInfo, QDir("folderName").entryInfoList(QDir::Files)) {
auto test1 = fileInfo.birthTime().date().daysTo(today); // Gives "0"
auto test11 = fileInfo.birthTime(); // Gives "msecs=280348"
bool test111 = test31.isValid(); // Gives "true"
auto test12 = fileInfo.birthTime().date(); // Gives "Julian day=2460417"
auto test13 = fileInfo.fileTime(QFileDevice::FileBirthTime); // Gives "msecs=280311"
auto test2 = fileInfo.baseName(); // Gives "filename"
auto test3 = fileInfo.suffix(); // Gives ".jpg"
QFileInfo
не имеет created()
метода
У @Fareanor QFileInfo
раньше был метод created()
, но он устарел: doc.qt.io/qt-5/qfileinfo-obsolete.html . Он все еще был доступен в Qt 5, чтобы старый код работал. Вместо этого ОП должен использовать birthTime().
Хм, ок, вместо этого я переключил созданный() на рождениеВремя(), но он дает те же результаты. Я также попробовал разделить ряд функций @ переменной test1. Я обнаружил, что независимо от использования метода create() илиbirthTime() он вернет сегодняшнюю дату, как будто он принимает дату создания файловой переменной, а не самого реального файла...
@wohlstad Ой, извини, извини, я этого не знал, я не смог найти это в онлайн-документе для Qt 5.12 :/
Может быть, времени нет? Я только что прочитал из документации: Если время рождения файла недоступно, эта функция возвращает недопустимое значение QDateTime.
Судя по тому, что я вижу, он возвращает действительный QDateTime: когда я прохожу мимо функции, у нее есть data->status=176 и data->msecs=282896. Кажется, он измеряет количество мсек, в течение которых он был жив, или что-то в этом роде. По крайней мере, это не выглядит недействительным. Я тоже не знаю, что означает статус, оба поля меняются при каждом выполнении.
Просто ради интереса: откуда вы знаете, что daysTo
всегда возвращает 0 — показанный код вообще не использует результат test1
? Пожалуйста, предоставьте минимальный воспроизводимый пример, который можно использовать для демонстрации проблемы.
Я добавляю переменную test1 в таблицу наблюдения и обнаруживаю, что таким образом могу получить больше информации из переменной, а не печатать ее или что-то подобное. То же самое и с другими переменными.
Теперь я нашел свое решение. В коде не было ничего плохого (за исключением использования устаревшей функции create()), а поле msecs в переменной QDate было отвлекающим маневром...
Проблема заключалась в том, что файлы сбрасывали время своего рождения при копировании в новое место. Поэтому они считаются созданными в тот день: сегодня.
Таким образом, даже если операционная система распознает файлы месячной давности, fileInfo.birthTime() или fileInfo.fileTime(QFileDevice::FileBirthTime) не отражает это. Я также попробовал QFileDevice::FileMetadataChangeTime, и это тоже не сработало.
Я заметил это, когда проверял прошедшие секунды вместо дней, используя secsTo() и QDateTime вместо днейTo() и QDate. Если бы я оставил скопированные файлы в папке нетронутыми в течение дня, я бы увидел, что им 1 день.
Что ж, причина этого довольно очевидна, если вдуматься: вы копируете файл. Представьте себе, что кто-то пишет свой дневник в 1042 году. Затем кто-то находит этот журнал в 1346 году и думает, что было бы хорошо сделать «книгу», поэтому он делает копию ее содержания, переписанную вручную. То же самое происходит и в 1680 году, но уже с подвижными типами. Кто-то другой делает то же самое в 1912 году, печатая книгу по изданию 1346 года (идентичному изданию 1680 года). В 1999 году еще один переписывает его в виде обычного текста, а еще один в 2024 году — в формате PDF. Когда дата рождения PDF-файла?
Подключите отладчик к своему коду и перейдите к вызову метода
daysTo
, чтобы узнать, что произойдет.