1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_tools.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #ifdef UNX 32*cdf0e10cSrcweir #include <errno.h> 33*cdf0e10cSrcweir #endif 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir #include <limits.h> 36*cdf0e10cSrcweir #include <string.h> 37*cdf0e10cSrcweir 38*cdf0e10cSrcweir #include "comdep.hxx" 39*cdf0e10cSrcweir #include <tools/fsys.hxx> 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir /************************************************************************* 42*cdf0e10cSrcweir |* 43*cdf0e10cSrcweir |* FileStat::FileStat() 44*cdf0e10cSrcweir |* 45*cdf0e10cSrcweir |* Beschreibung FSYS.SDW 46*cdf0e10cSrcweir |* Ersterstellung MI 11.06.91 47*cdf0e10cSrcweir |* Letzte Aenderung MI 11.06.91 48*cdf0e10cSrcweir |* 49*cdf0e10cSrcweir *************************************************************************/ 50*cdf0e10cSrcweir 51*cdf0e10cSrcweir FileStat::FileStat() 52*cdf0e10cSrcweir : // don't use Default-Ctors! 53*cdf0e10cSrcweir aDateCreated( sal_uIntPtr(0) ), 54*cdf0e10cSrcweir aTimeCreated( sal_uIntPtr(0) ), 55*cdf0e10cSrcweir aDateModified( sal_uIntPtr(0) ), 56*cdf0e10cSrcweir aTimeModified( sal_uIntPtr(0) ), 57*cdf0e10cSrcweir aDateAccessed( sal_uIntPtr(0) ), 58*cdf0e10cSrcweir aTimeAccessed( sal_uIntPtr(0) ) 59*cdf0e10cSrcweir { 60*cdf0e10cSrcweir nSize = 0; 61*cdf0e10cSrcweir nKindFlags = FSYS_KIND_UNKNOWN; 62*cdf0e10cSrcweir nError = FSYS_ERR_OK; 63*cdf0e10cSrcweir } 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir /************************************************************************* 66*cdf0e10cSrcweir |* 67*cdf0e10cSrcweir |* FileStat::FileStat() 68*cdf0e10cSrcweir |* 69*cdf0e10cSrcweir |* Beschreibung FSYS.SDW 70*cdf0e10cSrcweir |* Ersterstellung MI 11.06.91 71*cdf0e10cSrcweir |* Letzte Aenderung MI 11.06.91 72*cdf0e10cSrcweir |* 73*cdf0e10cSrcweir *************************************************************************/ 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir FileStat::FileStat( const DirEntry& rDirEntry, FSysAccess nAccess ) 76*cdf0e10cSrcweir : // don't use Default-Ctors! 77*cdf0e10cSrcweir aDateCreated( sal_uIntPtr(0) ), 78*cdf0e10cSrcweir aTimeCreated( sal_uIntPtr(0) ), 79*cdf0e10cSrcweir aDateModified( sal_uIntPtr(0) ), 80*cdf0e10cSrcweir aTimeModified( sal_uIntPtr(0) ), 81*cdf0e10cSrcweir aDateAccessed( sal_uIntPtr(0) ), 82*cdf0e10cSrcweir aTimeAccessed( sal_uIntPtr(0) ) 83*cdf0e10cSrcweir { 84*cdf0e10cSrcweir sal_Bool bCached = FSYS_ACCESS_CACHED == (nAccess & FSYS_ACCESS_CACHED); 85*cdf0e10cSrcweir sal_Bool bFloppy = FSYS_ACCESS_FLOPPY == (nAccess & FSYS_ACCESS_FLOPPY); 86*cdf0e10cSrcweir 87*cdf0e10cSrcweir #ifdef FEAT_FSYS_DOUBLESPEED 88*cdf0e10cSrcweir const FileStat *pStatFromDir = bCached ? rDirEntry.ImpGetStat() : 0; 89*cdf0e10cSrcweir if ( pStatFromDir ) 90*cdf0e10cSrcweir { 91*cdf0e10cSrcweir nError = pStatFromDir->nError; 92*cdf0e10cSrcweir nKindFlags = pStatFromDir->nKindFlags; 93*cdf0e10cSrcweir nSize = pStatFromDir->nSize; 94*cdf0e10cSrcweir aCreator = pStatFromDir->aCreator; 95*cdf0e10cSrcweir aType = pStatFromDir->aType; 96*cdf0e10cSrcweir aDateCreated = pStatFromDir->aDateCreated; 97*cdf0e10cSrcweir aTimeCreated = pStatFromDir->aTimeCreated; 98*cdf0e10cSrcweir aDateModified = pStatFromDir->aDateModified; 99*cdf0e10cSrcweir aTimeModified = pStatFromDir->aTimeModified; 100*cdf0e10cSrcweir aDateAccessed = pStatFromDir->aDateAccessed; 101*cdf0e10cSrcweir aTimeAccessed = pStatFromDir->aTimeAccessed; 102*cdf0e10cSrcweir } 103*cdf0e10cSrcweir else 104*cdf0e10cSrcweir #endif 105*cdf0e10cSrcweir Update( rDirEntry, bFloppy ); 106*cdf0e10cSrcweir } 107*cdf0e10cSrcweir 108*cdf0e10cSrcweir /************************************************************************* 109*cdf0e10cSrcweir |* 110*cdf0e10cSrcweir |* FileStat::IsYounger() 111*cdf0e10cSrcweir |* 112*cdf0e10cSrcweir |* Beschreibung FSYS.SDW 113*cdf0e10cSrcweir |* Ersterstellung MA 11.11.91 114*cdf0e10cSrcweir |* Letzte Aenderung MA 11.11.91 115*cdf0e10cSrcweir |* 116*cdf0e10cSrcweir *************************************************************************/ 117*cdf0e10cSrcweir 118*cdf0e10cSrcweir // sal_True wenn die Instanz j"unger als rIsOlder ist. 119*cdf0e10cSrcweir // sal_False wenn die Instanz "alter oder gleich alt wie rIsOlder ist. 120*cdf0e10cSrcweir 121*cdf0e10cSrcweir sal_Bool FileStat::IsYounger( const FileStat& rIsOlder ) const 122*cdf0e10cSrcweir { 123*cdf0e10cSrcweir if ( aDateModified > rIsOlder.aDateModified ) 124*cdf0e10cSrcweir return sal_True; 125*cdf0e10cSrcweir if ( ( aDateModified == rIsOlder.aDateModified ) && 126*cdf0e10cSrcweir ( aTimeModified > rIsOlder.aTimeModified ) ) 127*cdf0e10cSrcweir return sal_True; 128*cdf0e10cSrcweir 129*cdf0e10cSrcweir return sal_False; 130*cdf0e10cSrcweir } 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir /************************************************************************* 133*cdf0e10cSrcweir |* 134*cdf0e10cSrcweir |* FileStat::IsKind() 135*cdf0e10cSrcweir |* 136*cdf0e10cSrcweir |* Ersterstellung MA 11.11.91 (?) 137*cdf0e10cSrcweir |* Letzte Aenderung KH 16.01.95 138*cdf0e10cSrcweir |* 139*cdf0e10cSrcweir *************************************************************************/ 140*cdf0e10cSrcweir 141*cdf0e10cSrcweir sal_Bool FileStat::IsKind( DirEntryKind nKind ) const 142*cdf0e10cSrcweir { 143*cdf0e10cSrcweir sal_Bool bRet = ( ( nKind == FSYS_KIND_UNKNOWN ) && 144*cdf0e10cSrcweir ( nKindFlags == FSYS_KIND_UNKNOWN ) ) || 145*cdf0e10cSrcweir ( ( nKindFlags & nKind ) == nKind ); 146*cdf0e10cSrcweir return bRet; 147*cdf0e10cSrcweir } 148*cdf0e10cSrcweir 149*cdf0e10cSrcweir /************************************************************************* 150*cdf0e10cSrcweir |* 151*cdf0e10cSrcweir |* FileStat::HasReadOnlyFlag() 152*cdf0e10cSrcweir |* 153*cdf0e10cSrcweir |* Ersterstellung MI 06.03.97 154*cdf0e10cSrcweir |* Letzte Aenderung UT 01.07.98 155*cdf0e10cSrcweir |* 156*cdf0e10cSrcweir *************************************************************************/ 157*cdf0e10cSrcweir 158*cdf0e10cSrcweir sal_Bool FileStat::HasReadOnlyFlag() 159*cdf0e10cSrcweir { 160*cdf0e10cSrcweir #if defined WNT || defined UNX || defined OS2 161*cdf0e10cSrcweir return sal_True; 162*cdf0e10cSrcweir #else 163*cdf0e10cSrcweir return sal_False; 164*cdf0e10cSrcweir #endif 165*cdf0e10cSrcweir } 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir /************************************************************************* 168*cdf0e10cSrcweir |* 169*cdf0e10cSrcweir |* FileStat::GetReadOnlyFlag() 170*cdf0e10cSrcweir |* 171*cdf0e10cSrcweir |* Ersterstellung MI 06.03.97 172*cdf0e10cSrcweir |* Letzte Aenderung UT 02.07.98 173*cdf0e10cSrcweir |* 174*cdf0e10cSrcweir *************************************************************************/ 175*cdf0e10cSrcweir 176*cdf0e10cSrcweir sal_Bool FileStat::GetReadOnlyFlag( const DirEntry &rEntry ) 177*cdf0e10cSrcweir { 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir ByteString aFPath(rEntry.GetFull(), osl_getThreadTextEncoding()); 180*cdf0e10cSrcweir #if defined WNT 181*cdf0e10cSrcweir DWORD nRes = GetFileAttributes( (LPCTSTR) aFPath.GetBuffer() ); 182*cdf0e10cSrcweir return ULONG_MAX != nRes && 183*cdf0e10cSrcweir ( FILE_ATTRIBUTE_READONLY & nRes ) == FILE_ATTRIBUTE_READONLY; 184*cdf0e10cSrcweir #elif defined OS2 185*cdf0e10cSrcweir FILESTATUS3 aFileStat; 186*cdf0e10cSrcweir APIRET nRet = DosQueryPathInfo( (PSZ)aFPath.GetBuffer(), 1, &aFileStat, sizeof(aFileStat) ); 187*cdf0e10cSrcweir switch ( nRet ) 188*cdf0e10cSrcweir { 189*cdf0e10cSrcweir case NO_ERROR: 190*cdf0e10cSrcweir return FILE_READONLY == ( aFileStat.attrFile & FILE_READONLY ); 191*cdf0e10cSrcweir default: 192*cdf0e10cSrcweir return sal_False; 193*cdf0e10cSrcweir } 194*cdf0e10cSrcweir #elif defined UNX 195*cdf0e10cSrcweir /* could we stat the object? */ 196*cdf0e10cSrcweir struct stat aBuf; 197*cdf0e10cSrcweir if (stat(aFPath.GetBuffer(), &aBuf)) 198*cdf0e10cSrcweir return sal_False; 199*cdf0e10cSrcweir /* jupp, is writable for user? */ 200*cdf0e10cSrcweir return((aBuf.st_mode & S_IWUSR) != S_IWUSR); 201*cdf0e10cSrcweir #else 202*cdf0e10cSrcweir return sal_False; 203*cdf0e10cSrcweir #endif 204*cdf0e10cSrcweir } 205*cdf0e10cSrcweir 206*cdf0e10cSrcweir /************************************************************************* 207*cdf0e10cSrcweir |* 208*cdf0e10cSrcweir |* FileStat::SetReadOnlyFlag() 209*cdf0e10cSrcweir |* 210*cdf0e10cSrcweir |* Ersterstellung MI 06.03.97 211*cdf0e10cSrcweir |* Letzte Aenderung UT 01.07.98 212*cdf0e10cSrcweir |* 213*cdf0e10cSrcweir *************************************************************************/ 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir sal_uIntPtr FileStat::SetReadOnlyFlag( const DirEntry &rEntry, sal_Bool bRO ) 216*cdf0e10cSrcweir { 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir ByteString aFPath(rEntry.GetFull(), osl_getThreadTextEncoding()); 219*cdf0e10cSrcweir 220*cdf0e10cSrcweir #if defined WNT 221*cdf0e10cSrcweir DWORD nRes = GetFileAttributes( (LPCTSTR) aFPath.GetBuffer() ); 222*cdf0e10cSrcweir if ( ULONG_MAX != nRes ) 223*cdf0e10cSrcweir nRes = SetFileAttributes( (LPCTSTR) aFPath.GetBuffer(), 224*cdf0e10cSrcweir ( nRes & ~FILE_ATTRIBUTE_READONLY ) | 225*cdf0e10cSrcweir ( bRO ? FILE_ATTRIBUTE_READONLY : 0 ) ); 226*cdf0e10cSrcweir return ( ULONG_MAX == nRes ) ? ERRCODE_IO_UNKNOWN : 0; 227*cdf0e10cSrcweir #elif defined OS2 228*cdf0e10cSrcweir FILESTATUS3 aFileStat; 229*cdf0e10cSrcweir APIRET nRet = DosQueryPathInfo( (PSZ)aFPath.GetBuffer(), 1, &aFileStat, sizeof(aFileStat) ); 230*cdf0e10cSrcweir if ( !nRet ) 231*cdf0e10cSrcweir { 232*cdf0e10cSrcweir aFileStat.attrFile = ( aFileStat.attrFile & ~FILE_READONLY ) | 233*cdf0e10cSrcweir ( bRO ? FILE_READONLY : 0 ); 234*cdf0e10cSrcweir nRet = DosSetPathInfo( (PSZ)aFPath.GetBuffer(), 1, &aFileStat, sizeof(aFileStat), 0 ); 235*cdf0e10cSrcweir } 236*cdf0e10cSrcweir switch ( nRet ) 237*cdf0e10cSrcweir { 238*cdf0e10cSrcweir case NO_ERROR: 239*cdf0e10cSrcweir return ERRCODE_NONE; 240*cdf0e10cSrcweir 241*cdf0e10cSrcweir case ERROR_SHARING_VIOLATION: 242*cdf0e10cSrcweir return ERRCODE_IO_LOCKVIOLATION; 243*cdf0e10cSrcweir 244*cdf0e10cSrcweir default: 245*cdf0e10cSrcweir return ERRCODE_IO_NOTEXISTS; 246*cdf0e10cSrcweir } 247*cdf0e10cSrcweir #elif defined UNX 248*cdf0e10cSrcweir /* first, stat the object to get permissions */ 249*cdf0e10cSrcweir struct stat aBuf; 250*cdf0e10cSrcweir if (stat(aFPath.GetBuffer(), &aBuf)) 251*cdf0e10cSrcweir return ERRCODE_IO_NOTEXISTS; 252*cdf0e10cSrcweir /* set or clear write bit for user */ 253*cdf0e10cSrcweir mode_t nMode; 254*cdf0e10cSrcweir if (bRO) 255*cdf0e10cSrcweir { 256*cdf0e10cSrcweir nMode = aBuf.st_mode & ~S_IWUSR; 257*cdf0e10cSrcweir nMode = aBuf.st_mode & ~S_IWGRP; 258*cdf0e10cSrcweir nMode = aBuf.st_mode & ~S_IWOTH; 259*cdf0e10cSrcweir } 260*cdf0e10cSrcweir else 261*cdf0e10cSrcweir nMode = aBuf.st_mode | S_IWUSR; 262*cdf0e10cSrcweir /* change it on fs */ 263*cdf0e10cSrcweir if (chmod(aFPath.GetBuffer(), nMode)) 264*cdf0e10cSrcweir { 265*cdf0e10cSrcweir switch (errno) 266*cdf0e10cSrcweir { 267*cdf0e10cSrcweir case EPERM : 268*cdf0e10cSrcweir case EROFS : 269*cdf0e10cSrcweir return ERRCODE_IO_ACCESSDENIED; 270*cdf0e10cSrcweir default : 271*cdf0e10cSrcweir return ERRCODE_IO_NOTEXISTS; 272*cdf0e10cSrcweir } 273*cdf0e10cSrcweir } 274*cdf0e10cSrcweir else 275*cdf0e10cSrcweir return ERRCODE_NONE; 276*cdf0e10cSrcweir #else 277*cdf0e10cSrcweir return ERRCODE_IO_NOTSUPPORTED; 278*cdf0e10cSrcweir #endif 279*cdf0e10cSrcweir } 280*cdf0e10cSrcweir 281*cdf0e10cSrcweir /************************************************************************* 282*cdf0e10cSrcweir |* 283*cdf0e10cSrcweir |* FileStat::SetDateTime 284*cdf0e10cSrcweir |* 285*cdf0e10cSrcweir |* Ersterstellung PB 27.06.97 286*cdf0e10cSrcweir |* Letzte Aenderung 287*cdf0e10cSrcweir |* 288*cdf0e10cSrcweir *************************************************************************/ 289*cdf0e10cSrcweir #if defined WNT || defined OS2 290*cdf0e10cSrcweir 291*cdf0e10cSrcweir void FileStat::SetDateTime( const String& rFileName, 292*cdf0e10cSrcweir const DateTime& rNewDateTime ) 293*cdf0e10cSrcweir { 294*cdf0e10cSrcweir ByteString aFileName(rFileName, osl_getThreadTextEncoding()); 295*cdf0e10cSrcweir 296*cdf0e10cSrcweir Date aNewDate = rNewDateTime; 297*cdf0e10cSrcweir Time aNewTime = rNewDateTime; 298*cdf0e10cSrcweir 299*cdf0e10cSrcweir #if defined WNT 300*cdf0e10cSrcweir TIME_ZONE_INFORMATION aTZI; 301*cdf0e10cSrcweir DWORD dwTZI = GetTimeZoneInformation( &aTZI ); 302*cdf0e10cSrcweir 303*cdf0e10cSrcweir if ( dwTZI != (DWORD)-1 && dwTZI != TIME_ZONE_ID_UNKNOWN ) 304*cdf0e10cSrcweir { 305*cdf0e10cSrcweir // 1. Korrektur der Zeitzone 306*cdf0e10cSrcweir LONG nDiff = aTZI.Bias; 307*cdf0e10cSrcweir Time aOldTime = aNewTime; // alte Zeit merken 308*cdf0e10cSrcweir 309*cdf0e10cSrcweir // 2. evt. Korrektur Sommer-/Winterzeit 310*cdf0e10cSrcweir if ( dwTZI == TIME_ZONE_ID_DAYLIGHT ) 311*cdf0e10cSrcweir nDiff += aTZI.DaylightBias; 312*cdf0e10cSrcweir 313*cdf0e10cSrcweir Time aDiff( abs( nDiff / 60 /*Min -> Std*/ ), 0 ); 314*cdf0e10cSrcweir 315*cdf0e10cSrcweir if ( nDiff > 0 ) 316*cdf0e10cSrcweir { 317*cdf0e10cSrcweir aNewTime += aDiff; // Stundenkorrektur 318*cdf0e10cSrcweir 319*cdf0e10cSrcweir // bei "Uberlauf korrigieren 320*cdf0e10cSrcweir if ( aNewTime >= Time( 24, 0 ) ) 321*cdf0e10cSrcweir aNewTime -= Time( 24, 0 ); 322*cdf0e10cSrcweir 323*cdf0e10cSrcweir // Tages"uberlauf? 324*cdf0e10cSrcweir if ( aOldTime == Time( 0, 0 ) || // 00:00 -> 01:00 325*cdf0e10cSrcweir aNewTime < aOldTime ) // 23:00 -> 00:00 | 01:00 ... 326*cdf0e10cSrcweir aNewDate++; 327*cdf0e10cSrcweir } 328*cdf0e10cSrcweir else if ( nDiff < 0 ) 329*cdf0e10cSrcweir { 330*cdf0e10cSrcweir aNewTime -= aDiff; // Stundenkorrektur 331*cdf0e10cSrcweir 332*cdf0e10cSrcweir // negative Zeit (-1:00) korrigieren: 23:00 333*cdf0e10cSrcweir if (aNewTime < Time( 0, 0 ) ) 334*cdf0e10cSrcweir aNewTime += Time( 24, 0 ); 335*cdf0e10cSrcweir 336*cdf0e10cSrcweir // Tagesunterlauf ? 337*cdf0e10cSrcweir if ( aOldTime == Time( 0, 0 ) || // 00:00 -> 23:00 338*cdf0e10cSrcweir aNewTime > aOldTime ) // 01:00 -> 23:00 | 22:00 ... 339*cdf0e10cSrcweir aNewDate--; 340*cdf0e10cSrcweir } 341*cdf0e10cSrcweir } 342*cdf0e10cSrcweir 343*cdf0e10cSrcweir 344*cdf0e10cSrcweir SYSTEMTIME aTime; 345*cdf0e10cSrcweir aTime.wYear = aNewDate.GetYear(); 346*cdf0e10cSrcweir aTime.wMonth = aNewDate.GetMonth(); 347*cdf0e10cSrcweir aTime.wDayOfWeek = 0; 348*cdf0e10cSrcweir aTime.wDay = aNewDate.GetDay(); 349*cdf0e10cSrcweir aTime.wHour = aNewTime.GetHour(); 350*cdf0e10cSrcweir aTime.wMinute = aNewTime.GetMin(); 351*cdf0e10cSrcweir aTime.wSecond = aNewTime.GetSec(); 352*cdf0e10cSrcweir aTime.wMilliseconds = 0; 353*cdf0e10cSrcweir FILETIME aFileTime; 354*cdf0e10cSrcweir SystemTimeToFileTime( &aTime, &aFileTime ); 355*cdf0e10cSrcweir 356*cdf0e10cSrcweir HANDLE hFile = CreateFile( aFileName.GetBuffer(), GENERIC_WRITE, 0, 0, 357*cdf0e10cSrcweir OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ); 358*cdf0e10cSrcweir 359*cdf0e10cSrcweir if ( hFile != INVALID_HANDLE_VALUE ) 360*cdf0e10cSrcweir { 361*cdf0e10cSrcweir SetFileTime( hFile, &aFileTime, &aFileTime, &aFileTime ); 362*cdf0e10cSrcweir CloseHandle( hFile ); 363*cdf0e10cSrcweir } 364*cdf0e10cSrcweir #elif defined OS2 365*cdf0e10cSrcweir 366*cdf0e10cSrcweir // open file 367*cdf0e10cSrcweir ULONG nAction = FILE_EXISTED; 368*cdf0e10cSrcweir HFILE hFile = 0; 369*cdf0e10cSrcweir ULONG nFlags = OPEN_FLAGS_WRITE_THROUGH | 370*cdf0e10cSrcweir OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NO_CACHE | 371*cdf0e10cSrcweir OPEN_FLAGS_RANDOM | OPEN_FLAGS_NOINHERIT | 372*cdf0e10cSrcweir OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE; 373*cdf0e10cSrcweir 374*cdf0e10cSrcweir APIRET nRet = DosOpen((PSZ)aFileName.GetBuffer(), &hFile, (PULONG)&nAction, 375*cdf0e10cSrcweir 0/*size*/, FILE_NORMAL, 376*cdf0e10cSrcweir OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS, 377*cdf0e10cSrcweir nFlags, 0/*ea*/); 378*cdf0e10cSrcweir 379*cdf0e10cSrcweir if ( nRet == 0 ) 380*cdf0e10cSrcweir { 381*cdf0e10cSrcweir FILESTATUS3 FileInfoBuffer; 382*cdf0e10cSrcweir 383*cdf0e10cSrcweir nRet = DosQueryFileInfo( 384*cdf0e10cSrcweir hFile, 1, &FileInfoBuffer, sizeof(FileInfoBuffer)); 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir if ( nRet == 0 ) 387*cdf0e10cSrcweir { 388*cdf0e10cSrcweir FDATE aNewDate; 389*cdf0e10cSrcweir FTIME aNewTime; 390*cdf0e10cSrcweir 391*cdf0e10cSrcweir // create date and time words 392*cdf0e10cSrcweir aNewDate.day = rNewDateTime.GetDay(); 393*cdf0e10cSrcweir aNewDate.month = rNewDateTime.GetMonth(); 394*cdf0e10cSrcweir aNewDate.year = rNewDateTime.GetYear() - 1980; 395*cdf0e10cSrcweir aNewTime.twosecs = rNewDateTime.GetSec() / 2; 396*cdf0e10cSrcweir aNewTime.minutes = rNewDateTime.GetMin(); 397*cdf0e10cSrcweir aNewTime.hours = rNewDateTime.GetHour(); 398*cdf0e10cSrcweir 399*cdf0e10cSrcweir // set file date and time 400*cdf0e10cSrcweir FileInfoBuffer.fdateCreation = aNewDate; 401*cdf0e10cSrcweir FileInfoBuffer.ftimeCreation = aNewTime; 402*cdf0e10cSrcweir FileInfoBuffer.fdateLastAccess = aNewDate; 403*cdf0e10cSrcweir FileInfoBuffer.ftimeLastAccess = aNewTime; 404*cdf0e10cSrcweir FileInfoBuffer.fdateLastWrite = aNewDate; 405*cdf0e10cSrcweir FileInfoBuffer.ftimeLastWrite = aNewTime; 406*cdf0e10cSrcweir 407*cdf0e10cSrcweir DosSetFileInfo(hFile, 1, &FileInfoBuffer, sizeof(FileInfoBuffer)); 408*cdf0e10cSrcweir } 409*cdf0e10cSrcweir DosClose(hFile); 410*cdf0e10cSrcweir } 411*cdf0e10cSrcweir #endif 412*cdf0e10cSrcweir 413*cdf0e10cSrcweir } 414*cdf0e10cSrcweir #endif 415