Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Изменение атрибутов каталога


Автор: vodiv 27.12.2010, 12:30
Привет знатокам С!
Есть необходимость измениеть дату и время модификации существующего каталога. Поиски подходящей функции в 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], или их кнопочными аналогами

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)