?

Log in

No account? Create an account

Previous Entry | Next Entry

Win32 API и POSIX

Изначально написал (или нагуглил?) программист под Windows.
Мне нужно было перенести под макось.
Сколько времени требуется, чтобы разобраться в первой версии, и сколько, чтобы во второй?



#ifdef WIN32
void SetFileModifiedTime(const char* szFullName)
{
    HANDLE hFile = CreateFile(
        szFullName,
        GENERIC_WRITE,
        FILE_SHARE_READ,
        NULL,
        OPEN_ALWAYS,
        FILE_WRITE_ATTRIBUTES,
        NULL);

    if (hFile != INVALID_HANDLE_VALUE)
    {
        FILETIME ftCreate, ftAccess, ftWrite;

        GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite);

        GetSystemTimeAsFileTime(&ftWrite);
        memcpy(&ftAccess, &ftWrite, sizeof(ftAccess));

        SetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite);
        CloseHandle(hFile); 
    }
}
#else
void SetFileModifiedTime(const char* szFullName)
{
    utimes(szFullName, NULL);
}
#endif

Comments

( 11 comments — Leave a comment )
larubin
May. 26th, 2011 06:55 am (UTC)
Ну в первой все написано - открыли файл, взяли три времени - создания, аксеса, записи, затем текущее время кладет во время аксеса и время записи, ну и проставили все три времени обратно.

Во второй вызывается какая-то функция, которая что-то делает. Из названия -- utimes -- непонятно, что она делает, кроме того, что что-то со временами. Надо читать ман, понимать что она делает, т.е. переключаться от процесса чтения исходников в процесс чтения мана, а потом переключаться
hayate_
May. 26th, 2011 08:39 am (UTC)
Ну в первой все написано - открыли файл

Где ты видишь "открыли"? Лично я вижу "создать файл".
larubin
May. 26th, 2011 08:45 am (UTC)
Ну кстати да, создать файл. И как написали ниже, если файла не будет, то он будет создан.
hayate_
May. 26th, 2011 09:26 am (UTC)
Вооооот.
А из чего следует, что если файл есть - то он не будет перезаписан? Из чего следует, что если файл существует - то функция его откроет, не стирая содержимого?
Для человека, который не знает винАПИ, в смысле.
Потому что твой комментарий о понятности - он сугубо односторонний. Взгляд Windows программиста :)
dimakornilov
May. 26th, 2011 07:43 am (UTC)
Функции делают что-то внутри себя и ничего не возвращают в случае ошибки, например, при отсутствии прав доступа к файлу. Я бы завернул обе версии на ревью только из-за этого.
(Deleted comment)
dimakornilov
May. 26th, 2011 07:50 am (UTC)
И еще будут ли две версии работать одинаково, если файл не существует? У меня складывается впечатление, что виндовая версия создаст файл, а на макоси будет ошибка.
tilir_at_sj
Jun. 13th, 2011 05:59 am (UTC)
...
Если мне не изменяет память и google, то сигнатуры функций utime/utimes в posix:

int utime(const char *filename, const struct utimbuf *buf);
int utimes(const char *filename, const struct timeval times[2]);

Насколько я понимаю вы используете вторую. Но передавать NULL вместо аргумента, чётко специфицирующего статический массив из двух элементов -- развлечение крайне опасное.

Ну и да, обе не возвращают кодов ошибки. Виндовая понятно почему, там для этого есть ::GetLastError или как-то так. В posix-ной я бы вернул что-нибудь.
hayate_
Jun. 13th, 2011 06:49 am (UTC)
Re: ...
Но передавать NULL вместо аргумента, чётко специфицирующего статический массив из двух элементов -- развлечение крайне опасное.

С чего бы это?
В том же самом man utimes написано, что можно передавать NULL.

Виндовая понятно почему, там для этого есть ::GetLastError или как-то так. В posix-ной я бы вернул что-нибудь.

Ну а в позиксе есть errno,
tilir_at_sj
Jun. 13th, 2011 11:49 pm (UTC)
Re: ...
Как минимум странное утверждение составителей мана. Очевидно, что если 2*sizeof(struct timeval) != sizeof(NULL), то стек может запортится.
hayate_
Jun. 14th, 2011 07:40 am (UTC)
Re: ...
Как минимум странное утверждение составителей мана. Очевидно, что если 2*sizeof(struct timeval) != sizeof(NULL), то стек может запортится.

Что-то, ИМХО, вас вообще не в ту степь занесло.
Во-первых, почему обязательно стек? На многих архитектурах параметры в функции передаются через регистры.
Во-вторых, на тех архитектурах, на которых для передачи параметров используется стек, функции utimes будет передано два указателя. Один на имя файла, второй на массив из двух структур timeval.
oboguev
Jan. 17th, 2012 02:37 am (UTC)
Если программиста устраивала функция utime(s), то он перестарался -- в Windows этот wrapper тоже есть, и можно было обойтись без ifdef.

А вот в обратную сторону функциональность утрачена: Posix не предоставляет ни разрешения времени модификации, создания или обращения к файлу меньше, чем 1 сек., ни набора опций предоставляемых CreateFile.
( 11 comments — Leave a comment )