Index: src/ch/TLocalFilesystem.cpp
===================================================================
diff -u -N -r28b540c17739ad8b63f3b199e0e2151ec048bd05 -r7749d67cd70821fef9cc51303d42625fbcc2aa9d
--- src/ch/TLocalFilesystem.cpp	(.../TLocalFilesystem.cpp)	(revision 28b540c17739ad8b63f3b199e0e2151ec048bd05)
+++ src/ch/TLocalFilesystem.cpp	(.../TLocalFilesystem.cpp)	(revision 7749d67cd70821fef9cc51303d42625fbcc2aa9d)
@@ -24,6 +24,8 @@
 #include "TLocalFilesystem.h"
 #include "TAutoHandles.h"
 #include "FileInfo.h"
+#include "..\Common\FileSupport.h"
+#include "DataBuffer.h"
 
 void TLocalFilesystem::GetDriveData(const chcore::TSmartPath& spPath, int* piDrvNum, UINT* puiDrvType)
 {
@@ -157,11 +159,16 @@
 	return ::MoveFile(PrependPathExtensionIfNeeded(pathSource).ToString(), PrependPathExtensionIfNeeded(pathDestination).ToString()) != FALSE;
 }
 
-TLocalFilesystemFind TLocalFilesystem::CreateFinder(const chcore::TSmartPath& pathDir, const chcore::TSmartPath& pathMask)
+TLocalFilesystemFind TLocalFilesystem::CreateFinderObject(const chcore::TSmartPath& pathDir, const chcore::TSmartPath& pathMask)
 {
 	return TLocalFilesystemFind(pathDir, pathMask);
 }
 
+TLocalFilesystemFile TLocalFilesystem::CreateFileObject()
+{
+	return TLocalFilesystemFile();
+}
+
 chcore::TSmartPath TLocalFilesystem::PrependPathExtensionIfNeeded(const chcore::TSmartPath& pathInput)
 {
 	if(pathInput.GetLength() > _MAX_PATH - 1)
@@ -226,3 +233,83 @@
 		FindClose(m_hFind);
 	m_hFind = INVALID_HANDLE_VALUE;
 }
+
+TLocalFilesystemFile::TLocalFilesystemFile() :
+	m_hFile(INVALID_HANDLE_VALUE),
+	m_pathFile()
+{
+}
+
+TLocalFilesystemFile::~TLocalFilesystemFile()
+{
+	Close();
+}
+
+bool TLocalFilesystemFile::OpenExistingForReading(const chcore::TSmartPath& pathFile, bool bNoBuffering)
+{
+	Close();
+
+	m_hFile = ::CreateFile(TLocalFilesystem::PrependPathExtensionIfNeeded(pathFile).ToString(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffering ? FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH : 0), NULL);
+	if(m_hFile == INVALID_HANDLE_VALUE)
+		return false;
+	return true;
+}
+
+bool TLocalFilesystemFile::CreateNewForWriting(const chcore::TSmartPath& pathFile, bool bNoBuffering)
+{
+	Close();
+
+	m_hFile = ::CreateFile(TLocalFilesystem::PrependPathExtensionIfNeeded(pathFile).ToString(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffering ? FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH : 0), NULL);
+	if(m_hFile == INVALID_HANDLE_VALUE)
+		return false;
+	return true;
+}
+
+bool TLocalFilesystemFile::OpenExistingForWriting(const chcore::TSmartPath& pathFile, bool bNoBuffering)
+{
+	Close();
+
+	m_hFile = CreateFile(TLocalFilesystem::PrependPathExtensionIfNeeded(pathFile).ToString(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffering ? FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH : 0), NULL);
+	if(m_hFile == INVALID_HANDLE_VALUE)
+		return false;
+	return true;
+}
+
+bool TLocalFilesystemFile::SetFilePointer(long long llNewPos, DWORD dwMoveMethod)
+{
+	if(!IsOpen())
+		return false;
+
+	return (SetFilePointer64(m_hFile, llNewPos, dwMoveMethod) != -1);
+}
+
+bool TLocalFilesystemFile::SetEndOfFile()
+{
+	if(!IsOpen())
+		return false;
+
+	return ::SetEndOfFile(m_hFile) != FALSE;
+}
+
+bool TLocalFilesystemFile::ReadFile(CDataBuffer& rBuffer, DWORD dwToRead, DWORD& rdwBytesRead)
+{
+	if(!IsOpen())
+		return false;
+
+	return ::ReadFile(m_hFile, rBuffer, dwToRead, &rdwBytesRead, NULL) != FALSE;
+}
+
+bool TLocalFilesystemFile::WriteFile(CDataBuffer& rBuffer, DWORD dwToWrite, DWORD& rdwBytesWritten)
+{
+	if(!IsOpen())
+		return false;
+
+	return ::WriteFile(m_hFile, rBuffer, dwToWrite, &rdwBytesWritten, NULL) != NULL && dwToWrite == rdwBytesWritten;
+}
+
+void TLocalFilesystemFile::Close()
+{
+	if(m_hFile != INVALID_HANDLE_VALUE)
+		::CloseHandle(m_hFile);
+	m_hFile = INVALID_HANDLE_VALUE;
+}