Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение атрибутов каталога 
:(
    Опции темы
vodiv
  Дата 27.12.2010, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 11.11.2010

Репутация: нет
Всего: нет



Привет знатокам С!
Есть необходимость измениеть дату и время модификации существующего каталога. Поиски подходящей функции в 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
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1407 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.