1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
6 #include "stdafx.h" // Precompiled header key.
9 CFileStream::CFileStream()
11 , _hFile(INVALID_HANDLE_VALUE)
15 CFileStream::~CFileStream()
20 HRESULT CFileStream::OpenForRead(LPCWSTR wzFilePath)
23 DWORD dwShareMode = FILE_SHARE_READ;
25 dwShareMode |= FILE_SHARE_DELETE;
27 _ASSERTE(_hFile == INVALID_HANDLE_VALUE && wzFilePath);
28 if (_hFile != INVALID_HANDLE_VALUE || !wzFilePath) {
33 _hFile = WszCreateFile(wzFilePath, GENERIC_READ,
35 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
36 if (_hFile == INVALID_HANDLE_VALUE) {
37 hr = HRESULT_FROM_WIN32(GetLastError());
45 HRESULT CFileStream::OpenForWrite(LPCWSTR wzFilePath)
49 _ASSERTE(_hFile == INVALID_HANDLE_VALUE && wzFilePath);
50 if (_hFile != INVALID_HANDLE_VALUE || !wzFilePath) {
55 _hFile = WszCreateFile(wzFilePath, GENERIC_WRITE,
56 FILE_SHARE_READ, NULL,
57 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
59 if (_hFile == INVALID_HANDLE_VALUE)
61 hr = HRESULT_FROM_WIN32(GetLastError());
69 HRESULT CFileStream::QueryInterface(REFIID riid, void **ppv)
78 if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IStream)) {
79 *ppv = static_cast<IStream *>(this);
92 STDMETHODIMP_(ULONG) CFileStream::AddRef()
94 return InterlockedIncrement(&_cRef);
97 STDMETHODIMP_(ULONG) CFileStream::Release()
99 ULONG ulRef = InterlockedDecrement(&_cRef);
108 HRESULT CFileStream::Read(void *pv, ULONG cb, ULONG *pcbRead)
113 if (pcbRead != NULL) {
117 _ASSERTE(_hFile != INVALID_HANDLE_VALUE);
118 if (_hFile == INVALID_HANDLE_VALUE) {
123 if (!::ReadFile(_hFile, pv, cb, &cbRead, NULL)) {
124 hr = HRESULT_FROM_WIN32(::GetLastError());
135 if (pcbRead != NULL) {
143 HRESULT CFileStream::Write(void const *pv, ULONG cb, ULONG *pcbWritten)
148 if (pcbWritten != NULL) {
152 _ASSERTE(_hFile != INVALID_HANDLE_VALUE);
153 if (_hFile == INVALID_HANDLE_VALUE) {
158 if (!::WriteFile(_hFile, pv, cb, &cbWritten, NULL)) {
159 hr = HRESULT_FROM_WIN32(::GetLastError());
163 if (cbWritten == 0) {
170 if (pcbWritten != NULL) {
171 *pcbWritten = cbWritten;
178 HRESULT CFileStream::Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
180 #if 1 // SetFilePointerEx not supported on Win9x
187 _ASSERTE(_hFile != INVALID_HANDLE_VALUE);
188 if (_hFile == INVALID_HANDLE_VALUE) {
194 case STREAM_SEEK_SET:
195 dwFileOrigin = FILE_BEGIN;
198 case STREAM_SEEK_CUR:
199 dwFileOrigin = FILE_CURRENT;
202 case STREAM_SEEK_END:
203 dwFileOrigin = FILE_END;
211 bRet = SetFilePointerEx(_hFile, dlibMove, (LARGE_INTEGER *)plibNewPosition,
214 hr = HRESULT_FROM_WIN32(::GetLastError());
224 HRESULT CFileStream::SetSize(ULARGE_INTEGER libNewSize)
229 HRESULT CFileStream::CopyTo(IStream *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
234 HRESULT CFileStream::Commit(DWORD grfCommitFlags)
238 if (grfCommitFlags != 0) {
244 hr = HRESULT_FROM_WIN32(GetLastError());
251 HRESULT CFileStream::Revert()
256 HRESULT CFileStream::LockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
261 HRESULT CFileStream::UnlockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
266 HRESULT CFileStream::Stat(STATSTG *pstatstg, DWORD grfStatFlag)
271 HRESULT CFileStream::Clone(IStream **ppIStream)
277 BOOL CFileStream::Close()
279 BOOL fSuccess = FALSE;
281 if (_hFile != INVALID_HANDLE_VALUE) {
282 if (!::CloseHandle(_hFile)) {
283 _hFile = INVALID_HANDLE_VALUE;
287 _hFile = INVALID_HANDLE_VALUE;