Xynosural.net Ответов: 3

C++ как я могу сравнить (больше, чем тогда) ftcreationtime с windows ?


Я пытаюсь сравнить дату создания файла с той, что у меня есть в моей структуре, однако в отличие от целого числа я не могу использовать оператор > Для этого, уже несколько часов ищу разумное объяснение, как на самом деле это сделать, но пока ничего не получил и поэтому застрял.


// Convert to string to use std::find function
			std::string temp(Current_File.cFileName);

			// Convert characters to lowercase
			std::transform(temp.begin(), temp.end(), temp.begin(), ::tolower);
			for (int i = 0; i < 100; i++)
			{
				// Maybe put this when the triggerword is actualy added, so it doesnt do it every freaking time it enters this loop
				std::transform(Triggers[i].Triggerword.begin(), Triggers[i].Triggerword.end(), Triggers[i].Triggerword.begin(), ::tolower);
				
				// If this triggerword is a channel and the string is not empty
				if (Triggers[i].Channel && Triggers[i].Triggerword != "")
				{
					if (temp.find(Triggers[i].Triggerword) != std::string::npos || Triggers[i].Triggerword == "*")
					{
						// Count positives for debugging
						found++;
						for (int c = 0; c < 100; c++)
						{
							if (Triggers[i].Triggerword == Files[c].Triggername || Files[c].Triggername == "")
							{
								Files[c].Triggername = Triggers[i].Triggerword;
								if (Current_File.ftCreationTime > Files[c].FileDate)
								{
									Files[c].FileDate = Current_File.ftCreationTime;
								}
								// We found what we needed, exit both loops and get the next file
								c = 100;
								i = 100;
							}
						}
					}
				}
			}


Files Filedate is FILETIME FileDate; in a structure.


Итак, чтобы округлить его, мой вопрос здесь заключается в следующем: как я могу проверить, больше ли время создания/дата файла, чем значение в FileDate ?
(Ps. Это для windows, если это имеет значение)

Заранее спасибо

Что я уже пробовал:

В основном гугля, так как в документации не указано, что такое тип FILETIME на самом деле, я проверил его headerfile в vc++, но это не дает мне никакой ясности в том, что это такое на самом деле.

Rick York

"В основном гугля, так как в документации не указано, что такое тип FILETIME на самом деле, я проверил его headerfile в vc++, но это не дает мне никакой ясности, что это такое на самом деле."

Я не знаю, откуда это берется, но это совсем не так. Вы можете щелкнуть правой кнопкой мыши слово FILETIME и выбрать "перейти к определению", и оно покажет вам, что это такое на самом деле.

3 Ответов

Рейтинг:
2

Leo Chapiro

Попробуйте использовать Функция CompareFileTime | Microsoft Docs[^] :

LONG CompareFileTime(
  const FILETIME *lpFileTime1,
  const FILETIME *lpFileTime2
);


Рейтинг:
18

Richard MacCutchan

Да, вы можете использовать обычные реляционные операторы для значений времени. Вам просто нужно убедиться, что оба они находятся в одной и той же форме. Видеть https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getfiletime[^].


Рейтинг:
1

Xynosural.net

Кажется, я не обратил на это внимания.
Решение моей проблемы было таково :

Current_File.ftCreationTime.dwHighDateTime > Files[c].FileDate.dwHighDateTime

Спасибо за ответы!


Rick York

Если поля dwHighDateTime равны, они все равно могут отличаться в dwLowDateTime, а если Current_File был меньше, то вы получите неверный результат.

Лучше преобразовать его в A (U)LARGE_INTEGER и сравнить значения четырех частей. Я считаю, что именно это делает функция в решении _duDE.