bool CFile::Open(LPCTSTR lpszFileName, ULONG nOpenFlags) { if (!Close()) { return false; } if (lpszFileName == NULL || _tcslen(lpszFileName) == 0) { return false; } m_bCloseOnDelete = true; m_hFile = INVALID_HANDLE_VALUE; ULONG dwAccess = 0; switch (nOpenFlags & 3) { case modeRead: dwAccess = GENERIC_READ; break; case modeWrite: dwAccess = GENERIC_WRITE; break; case modeReadWrite: dwAccess = GENERIC_READ|GENERIC_WRITE; break; default: ATLASSERT(false); } COSVersion osver; WORD ostype = osver.GetOSType(); BOOL is_NT =((ostype & OS_WINNT) != 0); // map share mode ULONG dwShareMode = 0; dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; if ((nOpenFlags & shareDenyWrite) == shareDenyWrite) { dwShareMode &= ~FILE_SHARE_WRITE; } if ((nOpenFlags & shareDenyRead) == shareDenyRead) { dwShareMode &= ~FILE_SHARE_READ; } if ((nOpenFlags & shareExclusive) == shareExclusive) { dwShareMode = 0; } // map modeNoInherit flag SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = (nOpenFlags & modeNoInherit) == 0; // map creation flags ULONG dwCreateFlag = 0; if (nOpenFlags & modeCreate) { if (nOpenFlags & modeNoTruncate) dwCreateFlag = OPEN_ALWAYS; else dwCreateFlag = CREATE_ALWAYS; } else dwCreateFlag = OPEN_EXISTING; // attempt file creation HANDLE hFile = ::CreateFile(lpszFileName, dwAccess, dwShareMode, is_NT ? &sa : NULL, dwCreateFlag, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { //#define ERROR_PATH_NOT_FOUND 3L //ULONG err = GetLastError(); return false; } m_hFile = hFile; m_bCloseOnDelete = TRUE; return TRUE; }