Привет знатокам С! Есть необходимость измениеть дату и время модификации существующего каталога. Поиски подходящей функции в MSDN не дали результата, который можно использовать в различных версиях Windows, включая 98. Вот что я пробовал: | Код | char FName[80]; CFileException ex; //1. получение атрибутов - проходит во всех версиях, WIN32_FILE_ATTRIBUTE_DATA fattr; GetFileAttributesEx(FName, GetFileExInfoStandard, &fattr);
CFileStatus stat; if(!File.GetStatus(FName, stat)) show_last_error("GetStatus error"); //2. но при установке - доступ не разрешен File.SetStatus(FName, stat);
//3. открыть каталог как файл - не проходит: доступ не разрешен (ошибка 5) OFSTRUCT OBuf; HFILE F=OpenFile(FName, &OBuf, 0); if(F==HFILE_ERROR) show_last_error("OpenFile error"); else _lclose(F); //4. открыть в других функциях, проходит только в WinXP с флагом, в 98 результат отрицательный с любыми флагами - нет доступа HANDLE FF=CreateFile(FName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,/*FILE_FLAG_BACKUP_SEMANTICS*/0,NULL); if(FF==INVALID_HANDLE_VALUE) show_last_error("CreateFile"); else CloseHandle(FF);
//5. попытка скопировать вместе с атрибутами, результат отрицательный - нет доступа if(!CopyFile(FName,"c:\\TMP\\DD",FALSE)) show_last_error("CopyFile"); //6. то же открытие файла другими словами с тем же результатом CFile File; if(!File.Open(FName, CFile::modeReadWrite, &ex)) { TCHAR szError[1024]; ex.GetErrorMessage(szError, 1024); MessageBox(szError,"File.Open"); } else File.Close(); //7. использование старой функции получения атрибутов, проходит struct _stat sstt; if(_stat(FName, &sstt)) MessageBox("_stat error"); int f=_open(FName,_O_RDWR); if(f==-1) { char str[80]; sprintf(str,"_open error=%s",strerror(errno)); MessageBox(str); } //8. установка атрибутов не проходит - нет доступа SetFileAttributes(FName, fattr); //9. старые функции непосредственной установки параметров, та же ошибка struct _utimbuf tbuf; tbuf.actime=stat.m_atime.GetTime(); tbuf.modtime=stat.m_mtime.GetTime(); if(_utime(FName, &tbuf)) { char str[80]; sprintf(str,"_utime error=%s",strerror(errno)); MessageBox(str); }
|
Таким образом, любые функции получения атрибутов, включая нужное время модификации, проходят нормально, но установка параметров без открытия файла дает ошибку. Открытие каталога возможно только функцией CreateFile в WinXP, тогда изменение атрибутов проходит нормально, но в Win98 этот способ недоступен. Больше никаких функций в MSDN не нашел, проверять низкоуровневые (int 21) не стал, подозреваю, что результат будет тот же. Может кто-нибудь знает другие способы, пишите! M GremlinProg | Если указываете код, пользуйтесь тегами [сode][/сode], или их кнопочными аналогами | Это сообщение отредактировал(а) GremlinProg - 27.12.2010, 14:30
|