Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/46: Рейтинг темы: голосов - 46, средняя оценка - 4.63
10 / 10 / 2
Регистрация: 09.10.2009
Сообщений: 46

Изменение даты создания произвольного файла

13.03.2011, 16:39. Показов 9667. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написать программу, изменяющую дату и время создания произвольного файла

Покапавшись нашел следующе, но что то не работает!!!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
BOOL GetFileTime
(
    HANDLE hFile,           // указатель на открытый файл
    LPFILETIME lpCreationTime,      // время создания
    LPFILETIME lpLastAccessTime,    // время доступа
    LPFILETIME lpLastWriteTime      // время модификации
);
#include "stdafx.h"
#include "windows.h"
#include "iostream.h"
 
void main()
{
    HANDLE hFile=NULL; 
    hFile=CreateFile("c:\\config.sys",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
    if (hFile!=NULL)
    {
        FILETIME fc;
        FILETIME fa;
        FILETIME fw;
        if (GetFileTime(hFile,&fc,&fa,&fw)!=0)
        {
            //.....
        }
        else
            cout << "error gettime" << endl;
    }
    else
        cout << "error open" << endl;
}
что нужно сделать для получения функции SetfileTime...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.03.2011, 16:39
Ответы с готовыми решениями:

Считывание и изменение даты и времени создания произвольного файла
Написать программу,считывающую и изменяющую дату и время создания произвольного файла. Имя файла, а также новые дату и время файла,...

Изменение времени создания файла на минус Х дней от текущей даты создания
День добрый, ветераны форума. Помогите пожалуйста следующую задачу: Есть папка в ней вложеные папки и файлы (более 20к штук),...

Изменение даты создания файла WinAPI
Добрый день, господа. Пишу оконное приложение, задача которого изменить дату создания некоторого каталога. Для этого я хочу использовать...

17
 Аватар для igorrr37
2877 / 2024 / 991
Регистрация: 21.12.2010
Сообщений: 3,761
Записей в блоге: 9
13.03.2011, 18:53
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <windows.h>
 
int main() {
    SYSTEMTIME st;
    FILETIME ft;
    OFSTRUCT of;
    HANDLE hFile=(HANDLE)OpenFile("D:\\myFile.txt", &of, OF_CREATE);
    if(!hFile){std::cerr<<"Opening file error\n"; return 1;}
    GetFileTime(hFile, &ft, NULL, NULL);
    FileTimeToSystemTime(&ft, &st);
    st.wYear=2020;
    SystemTimeToFileTime(&st, &ft);
    SetFileTime(hFile, &ft, NULL, NULL);
    CloseHandle(hFile);
}
3
10 / 10 / 2
Регистрация: 09.10.2009
Сообщений: 46
13.03.2011, 20:04  [ТС]
igorrr37, немного переделав получил следующее:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
SYSTEMTIME lf;
    FILETIME ft;
    OFSTRUCT of;
    HANDLE hFile=(HANDLE)OpenFile("D:\\myFile.txt", &of, OF_CREATE);
    if(!hFile)
    {
    std::cerr<<"Opening file error\n"; 
    return 1;}
        GetFileTime(hFile, &ft, NULL, NULL);
        FileTimeToSystemTime(&ft, &lf);
    WORD god, mesiac, den, chas, minuta, secunda;
    cout<<"Введите год (создания произвольного файла): ";
    cin>>god;
    cout<<"Введите месяц (создания произвольного файла): ";
    cin>>mesiac;
    cout<<"Введите день (создания произвольно файла): ";
    cin>>den;
    cout<<"Введите час (создания произвольно файла): ";
    cin>>chas;
    cout<<"Введите минута (создания произвольно файла): ";
    cin>>minuta;
    cout<<"Введите секунды (создания произвольно файла): ";
    cin>>secunda;
    lf.wYear=god;
    lf.wDay=den;
    lf.wMonth=mesiac;
    lf.wHour=chas;
    lf.wMinute=minuta;
    lf.wSecond=secunda;
    SystemTimeToFileTime(&lf, &ft);
    SetFileTime(hFile, &ft, NULL, NULL);
    CloseHandle(hFile);
работает и спасибо за помощь!!!
2
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
19.08.2020, 19:30
Цитата Сообщение от medik07 Посмотреть сообщение
igorrr37, немного переделав получил следующее:
lf.wHour=chas;
У меня почему wHour странно работает. Ставлю 0, в файле указывается 5 часов, ставлю 19 - в файле указывается 23.

Хотя все остальное нормально работает.
0
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
19.08.2020, 21:36
Цитата Сообщение от Optimus11 Посмотреть сообщение
У меня почему wHour странно работает. Ставлю 0, в файле указывается 5 часов, ставлю 19 - в файле указывается 23.
поправка на UTC?
вот так и написано в описани функции
https://docs.microsoft.com/en-... tofiletime

операционная система отображает это время в Вашей временной зоне
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
20.08.2020, 22:04
А подскажите пожалуйста, что то не пойму:

C++
1
2
3
4
5
6
7
    FILETIME my_filetime;
 
   SYSTEMTIME my_sysytemtime;
 
    GetFileTime(my_handle, &my_filetime, NULL, NULL);     //Получаем дату из файла в структуру FILETIME
 
    FileTimeToSystemTime(&my_filetime, &my_sysytemtime);  //Потом конвертируем дату из структуры FILETIME в структутру SYSTEMTIME
Но зачем мы конвертируем дату из FILETIME в SYSTEMTIME, если потом все равно заполняем структуру SYSTEMTIME вручную той датой и временем которая нам нужна:

C++
1
2
3
4
5
6
           my_sysytemtime.wYear = 2015;
        my_sysytemtime.wDay = 25;
        my_sysytemtime.wMonth = 05;
        my_sysytemtime.wHour = 10;
        my_sysytemtime.wMinute = 9;
        my_sysytemtime.wSecond = 55;
?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.08.2020, 22:11
Цитата Сообщение от Optimus11 Посмотреть сообщение
Но зачем мы конвертируем дату из FILETIME в SYSTEMTIME, если потом все равно заполняем структуру SYSTEMTIME вручную той датой и временем которая нам нужна:
Низачем. Можешь не конвертировать, просто заполнить SYSTEMTIME
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
21.08.2020, 19:18
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Низачем. Можешь не конвертировать, просто заполнить SYSTEMTIME
Так и делал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
FILETIME my_filetime;
SYSTEMTIME my_sysytemtime;
 
my_sysytemtime.wYear = 2009;
my_sysytemtime.wDay = 25;
my_sysytemtime.wMonth = 05;
my_sysytemtime.wHour = 10;
my_sysytemtime.wMinute = 9;
my_sysytemtime.wSecond = 55;
 
BOOL my_bool = SystemTimeToFileTime(&my_sysytemtime, &my_filetime);
cout << "my_bool <<": "<< my_bool<< ": "<< GetLastError()<<endl;  //Возвращает 0, ошибка 87 -   ERROR_INVALID_PARAMETER
Однако, если предварительно заполнить структуру FILETIME вызовом функции GetFileTime, то все происходит нормально. SystemTimeToFileTime завершается без ошибок.

То есть получается, что для того, чтобы функция SystemTimeToFileTime отработала корректно, нужно структуру FILETIME проинициализировать зачем то. Но даже в этом случае нужно проинициализиоровать корректно, потому что просто присвоить элементам структуры FILETIME какие то произвольные значения тоже не прокатывает, возникает та же ошибка.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.08.2020, 19:25
Цитата Сообщение от Optimus11 Посмотреть сообщение
cout << "my_bool <<": "<< my_bool<< ": "<< GetLastError()<<endl;  //Возвращает 0, ошибка 87 -   ERROR_INVALID_PARAMETER
Проинициализируй SYSTEMTIME нулями
C++
1
SYSTEMTIME my_sysytemtime = {};
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
21.08.2020, 19:28
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Проинициализируй SYSTEMTIME нулями
C++
1
SYSTEMTIME my_sysytemtime = {};
Тоже самое: ошибка 87 - ERROR_INVALID_PARAMETER
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.08.2020, 19:30
Цитата Сообщение от Optimus11 Посмотреть сообщение
Тоже самое: ошибка 87 - ERROR_INVALID_PARAMETER
У меня всё нормально, без ошибок
C++
1
2
3
4
5
6
7
8
9
10
11
12
        FILETIME my_filetime;
        SYSTEMTIME my_sysytemtime = {};
 
        my_sysytemtime.wYear = 2009;
        my_sysytemtime.wDay = 25;
        my_sysytemtime.wMonth = 05;
        my_sysytemtime.wHour = 10;
        my_sysytemtime.wMinute = 9;
        my_sysytemtime.wSecond = 55;
    
        BOOL my_bool = SystemTimeToFileTime(&my_sysytemtime, &my_filetime);
        std::cout << "my_bool : " << my_bool<< ": " << GetLastError() << std::endl;
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
21.08.2020, 19:35
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
У меня всё нормально, без ошибок
C++
1
2
3
4
5
6
7
8
9
10
11
12
        FILETIME my_filetime;
        SYSTEMTIME my_sysytemtime = {};
 
        my_sysytemtime.wYear = 2009;
        my_sysytemtime.wDay = 25;
        my_sysytemtime.wMonth = 05;
        my_sysytemtime.wHour = 10;
        my_sysytemtime.wMinute = 9;
        my_sysytemtime.wSecond = 55;
    
        BOOL my_bool = SystemTimeToFileTime(&my_sysytemtime, &my_filetime);
        std::cout << "my_bool : " << my_bool<< ": " << GetLastError() << std::endl;
Я не правильно Вас понял, подумал, что нужно попробывать только с обнуленным my_sysytemtime = {}
Так работает!

Но почему так ?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.08.2020, 19:36
Цитата Сообщение от Optimus11 Посмотреть сообщение
Но почему так ?
Потому что надо заполнять все поля структуры, иначе в них будет мусор
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
21.08.2020, 19:56
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Потому что надо заполнять все поля структуры, иначе в них будет мусор
Спасибо!
Теперь только что понял, что я заполнял же не все элементы структуры, а только нужные мне, а там были еще WORD wDayOfWeek и WORD wMilliseconds;.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
22.08.2020, 18:37
Цитата Сообщение от Serg_o_Grey Посмотреть сообщение
поправка на UTC?
вот так и написано в описани функции
https://docs.microsoft.com/en-... tofiletime

операционная система отображает это время в Вашей временной зоне
Подскажите, а как обычно учитывается смещение относительно времени UTC ?

То есть когда я заполняю элемент .wHour в структуре SYSTEMTIME - к примеру 21 час, это я заполняю время именно единое UTC.
Но мне то нужно мое компьютерное. То есть нужно учесть смещение.
Как я понял, есть функция GetTimeZoneInformationForYear, которая возвращает текущие настройки Windows в структуре TIME_ZONE_INFORMATION типа:

-.Bias - Текущее смещение для перевода местного времени на этом компьютере в минутах.

И вроде бы вот: осталось в структуре SYSTEMTIME указать необходимо мне местное время и вычесть смещение, чтобы в структуру SYSTEMTIME записалось время UTC, но есть еще переходы на зимнее, летнее время.

И вот тут не совсем понятно, в структуре TIME_ZONE_INFORMATION - что то много как то типов смещения - и смещение при переходе на летнее время, и смещение перехода какого стандартного времени(что это вообще такое), а если вообще в стране, которая находится в конкретной зоне - эти переходы отменили(ну как у нас к примеру), как тогда учитывать ?

Что то не понятно, как со 100% точностью все это учесть.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.08.2020, 18:53
Цитата Сообщение от Optimus11 Посмотреть сообщение
И вот тут не совсем понятно, в структуре TIME_ZONE_INFORMATION - что то много как то типов смещения - и смещение при переходе на летнее время, и смещение перехода какого стандартного времени(что это вообще такое), а если вообще в стране, которая находится в конкретной зоне - эти переходы отменили(ну как у нас к примеру), как тогда учитывать ?
Если отменили, то GetTimeZoneInformation это учтёт
TzSpecificLocalTimeToSystemTime
SystemTimeToTzSpecificLocalTime
https://docs.microsoft.com/en-... -functions
1
116 / 106 / 51
Регистрация: 29.03.2016
Сообщений: 480
22.08.2020, 19:01
мне видится это как конвертирование структуры SYSTEMTIME в long (unixtime), прибавление/вычитание к/от long необходимого количества секунд, и обратное конвертирование к SYSTEMTIME
а с летним/зимним временем и прочем библиотека пусть сама разбирается

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

Добавлено через 7 минут
найдено на просторах интернет
получаем смещение времени (в секундах) локальной машины относительно UTC

C++
1
2
3
4
5
6
7
8
9
10
#include "date/tz.h"
#include <iostream>
 
int
main()
{
    using date::operator<<;
    using std::chrono::system_clock;
    std::cout << date::current_zone()->get_info(system_clock::now()).offset << '\n';
}
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
22.08.2020, 20:09
Всем Спасибо!
Выбрал вариант с TzSpecificLocalTimeToSystemTime - работает и сторонних библиотек не нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.08.2020, 20:09
Помогаю со студенческими работами здесь

Изменение даты и времени создания файла
Доброго времени суток друзья. Как можно реализовать программу, которая изменяет дату и время создания файла? т.е есть кнопка Выбрать...

Изменение даты и времени создания/изменения файла
помогите пожалуйста, есть вот такая форма, нужно написать код для того чтобы изменить год,дату,время какого нибудь выбранного файла

Изменение даты создания папки и изменение MAC-адреса
Ребята всем привет. Нужна ваша помощь. Пишу bat для одной операции и столкнулся с проблемой что надо изменить дату создание папки Program...

Изменение даты создания нескольким файлам
Ребят, нужна программа, которая будет менять дату и время создания нескольким файлам, при чем время с каждым последующим файлом должно...

Изменение даты и времени создания файлов
Нужно написать батник, который будет менять дату и время создания файлов. Файлы могут быть указаны с помощью масок (или нескольких масок)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru